Java 7 cannot collect persistent code collected by Java 5

Does anyone know why Java 7 can't collect permanent generation applications, resulting in Java Lang. outofmemoryerror: permgen, while the Java 5 collection and application run well?

The application executes the evaluation of Jython expression in the loop, and one iteration is about The body of the 5-second ring looks like:

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

Screenshots of jvisual VM are used for applications running in Java 7 and Java 5

In both cases, the same parameters are used:

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

Solution

There is a small example to reproduce the problem. I found that programs running in Java 7 outside eclipse will not encounter memory leakage in the permanent generation

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 displays a debugger thread as the garbage collector root

Strangely, debugging applications in Java 5 do not have this problem

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>