¿Alguien sabe por qué java 7 no recoge la generación permanente de la aplicación, lo que da como resultado java.lang.OutOfMemoryError: PermGen, mientras que java 5 recopila la generación permanente y la aplicación se ejecuta ¿bien?Java 7 no recoge la generación permanente que se recopila en java 5
La aplicación hace la evaluación de expresiones jython en el ciclo, una iteración es de aprox. 5 seg. cuerpo del bucle se parece a:
PythonInterpreter py = new PythonInterpreter();
py.set("AI", 1);
((PyInteger)py.eval(expr)).getValue()
Imágenes de jvisual vm tomadas para aplicación en ejecución en Java 7 y Java 5.
En ambos casos se utilizan los mismos parámetros:
-Xmx700m
-XX:MaxPermSize=100m
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:"C:\Temp\gc.log" -XX:+PrintGCDetails -XX:-TraceClassUnloading -XX:+PrintClassHistogram
¿Ha comprobado los algoritmos de gc al iniciar sesión en JConsole o alguna otra herramienta? – kosa
Puede haber diferentes configuraciones de inicio de JVM. ¿Hay algo inusual en tu aplicación? como el código de carga en caliente, cargadores de clases personalizadas, etc. – Andy
La gente de GC siempre está retocando el GC, intentando desesperadamente mejorar el rendimiento, así que no me sorprende que haya tanta diferencia. Mi __guess__ es que ahora están enfocados en los 700Mb en lugar de en los 100Mb, y están permitiendo que la memoria permanente se expanda en lugar de gastar el esfuerzo por controlarla. Están enfocados en el alto rendimiento y mantenerse dentro de 700Mb en lugar de buenos números para PermGen. – RalphChapin