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

前端之家收集整理的这篇文章主要介绍了Java 7无法收集Java 5收集的永久代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有人知道为什么 java 7无法收集永久代的应用程序,导致java.lang.OutOfMemoryError:PermGen,而 Java 5收集永久代和应用程序运行良好?

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

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

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

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

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

解决方法

有一个小例子来重现问题,我发现在Eclipse之外的Java 7中运行的程序不会在永久代中遇到内存泄漏.
  1. import org.python.core.PySystemState;
  2. import org.python.util.PythonInterpreter;
  3.  
  4. public class Test01 {
  5.  
  6. public static void main(String[] args) throws Exception {
  7. PySystemState.initialize();
  8. long startNanos = System.nanoTime();
  9. for(int i = 0; i < 450000; i++) {
  10. PythonInterpreter pi = new PythonInterpreter();
  11. long elapsedNanos = System.nanoTime() - startNanos;
  12. int avgStepInMicros = (int)((elapsedNanos / 1000) / (i+1));
  13. final String code = String.format(
  14. "stepNo = %d + 1\n" +
  15. "if stepNo %% 100 == 0:\n" +
  16. " print 'stepNo: %%d,elapsedMillis: %%d,avgStepInMicros: %%d' %% (stepNo,%d,%d)",i,elapsedNanos/1000000,avgStepInMicros);
  17. pi.exec(code);
  18. }
  19. }
  20. }

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

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

猜你在找的Java相关文章