gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:01:48 25 4
gpt4 key购买 nike

有谁知道为什么java 7收集永久代应用失败,导致java.lang.OutOfMemoryError: PermGen,而java 5收集永久代应用运行良好?

App 在循环中对 jython 表达式求值,一次迭代大约为 1 次。 5 秒。循环体如下所示:

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

为在 java 7 和 java 5 中运行的应用截取的 jvisual vm 屏幕截图。

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

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

java 7 java 5

最佳答案

有一个小例子来重现这个问题,我发现在 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 + 1\n" +
"if stepNo %% 100 == 0:\n" +
" print 'stepNo: %%d, elapsedMillis: %%d, avgStepInMicros: %%d' %% (stepNo, %d, %d)", i, elapsedNanos/1000000, avgStepInMicros);
pi.exec(code);
}
}
}

MAT将调试器线程显示为垃圾收集器根。

GCRoot

奇怪的是用java 5调试app没有这个问题。

关于Java 7 无法收集由 Java 5 收集的永久代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11955948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com