加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java 7无法收集Java 5收集的永久代码

发布时间:2020-12-14 16:39:22 所属栏目:Java 来源:网络整理
导读:有没有人知道为什么 java 7无法收集永久代的应用程序,导致java.lang.OutOfMemoryError:PermGen,而 Java 5收集永久代和应用程序运行良好? 应用程序在循环中执行jython表达式的评估,一次迭代约为. 5秒 环的身体看起来像: PythonInterpreter py = new Python
有没有人知道为什么 java 7无法收集永久代的应用程序,导致java.lang.OutOfMemoryError:PermGen,而 Java 5收集永久代和应用程序运行良好?

应用程序在循环中执行jython表达式的评估,一次迭代约为. 5秒
环的身体看起来像:

PythonInterpreter py = new PythonInterpreter();
py.set("AI",1);
((PyInteger)py.eval(expr)).getValue()

jvisual vm的截图用于在java 7和java 5中运行的应用程序.

在这两种情况下,都使用相同的参数:

-Xmx700m 
-XX:MaxPermSize=100m
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:"C:Tempgc.log" -XX:+PrintGCDetails  -XX:-TraceClassUnloading -XX:+PrintClassHistogram

解决方法

有一个小例子来重现问题,我发现在Eclipse之外的Java 7中运行的程序不会在永久代中遇到内存泄漏.
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;

public class Test01 {

  public static void main(String[] args) throws Exception  {
    PySystemState.initialize();
    long startNanos = System.nanoTime();
    for(int i = 0; i < 450000; i++)    {
        PythonInterpreter pi = new PythonInterpreter();
        long elapsedNanos = System.nanoTime() - startNanos;
        int avgStepInMicros = (int)((elapsedNanos / 1000) / (i+1));
        final String code = String.format(
                "stepNo = %d + 1n" +
                "if stepNo %% 100 == 0:n" + 
                "  print 'stepNo: %%d,elapsedMillis: %%d,avgStepInMicros: %%d' %% (stepNo,%d,%d)",i,elapsedNanos/1000000,avgStepInMicros);
        pi.exec(code);
    }
  }
}

MAT显示一个调试器线程作为垃圾收集器根.

奇怪的是,在java 5中的调试应用程序没有这个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读