有没有人知道为什么
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:\Temp\gc.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 + 1\n" + "if stepNo %% 100 == 0:\n" + " print 'stepNo: %%d,elapsedMillis: %%d,avgStepInMicros: %%d' %% (stepNo,%d,%d)",i,elapsedNanos/1000000,avgStepInMicros); pi.exec(code); } } }
奇怪的是,在java 5中的调试应用程序没有这个问题.