Java 7无法收集java 5收集的永久生成

Mil*_*cel 10 java garbage-collection jython permgen

有谁知道为什么java 7无法收集永久代的app,导致java.lang.OutOfMemoryError:PermGen,而java 5收集永久代和app运行良好?

App在循环中对jython表达式进行评估,一次迭代约为.5秒 循环体看起来像:

PythonInterpreter py = new PythonInterpreter();
py.set("AI", 1);
((PyInteger)py.eval(expr)).getValue()
Run Code Online (Sandbox Code Playgroud)

用于在java 7和java 5中运行的app的jvisual vm的屏幕截图.

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

-Xmx700m 
-XX:MaxPermSize=100m
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:"C:\Temp\gc.log" -XX:+PrintGCDetails  -XX:-TraceClassUnloading -XX:+PrintClassHistogram 
Run Code Online (Sandbox Code Playgroud)

java 7 java 5

Mil*_*son 0

permgen 泄漏的一种可能性是每个 PyInteger 实现的 Serialized 接口存储在静态class_to_type映射 (PyType.java:101) 中,这是一个 Jython bug。据我所知,对 5 和 7 之间的 permgen 分配唯一有趣的变化是删除了 7 中的 intern'd 字符串以及对直接字节缓冲区内存分配的一些更改,因此图的时间行为可能可以通过卸载来解释Java 5 中每次迭代的类型。