Java 7 no puede recopilar la generación permanente que recopila Java 5

¿Alguien sabe por qué Java 7 no recopila la generación permanente de la aplicación, lo que resulta en java.lang.OutOfMemoryError: PermGen, mientras que Java 5 recopila la generación permanente y la aplicación funciona bien?

La aplicación evalúa las expresiones jython en el bucle, una iteración es de aprox. 5 seg. El cuerpo del bucle se ve así:

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

Capturas de pantalla de jvisual vm tomadas para la aplicación que se ejecuta 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 

java 7 java 5

Respuesta 1

Al tener un pequeño ejemplo para reproducir el problema, descubrí que el programa que se ejecuta en Java 7 fuera de Eclipse no sufre pérdidas de memoria en la generación permanente.

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 mostró un hilo del depurador como raíz del recolector de basura.

GCRoot

Es extraño que la aplicación de depuración en Java 5 no tenga este problema.

Respuesta: 2

Tengo dos aplicaciones, la aplicación1 se ejecuta con varios frascos dentro de una guerra y utiliza la seguridad de primavera (resumen) para la autenticación. app1 se ejecuta en tomcat, y tengo otra aplicación ejecutándose en otro contenedor web (...

Entonces, uso Apache POI para analizar un archivo de Excel en mi Base de Datos. Para esto, estoy inicializando un XSSFWorkbook de la siguiente manera: XSSFWorkbook workbook = new XSSFWorkbook (fIP); Luego procedo con mi ...

¿Hay alguna herramienta en Eclipse comparable con phpMyAdmin? El proyecto está en Java y quiero usar la base de datos H2. He instalado DTP pero no es tan fácil de usar como phpMyAdmin. No encontré ...

No puedo entenderlo, debería deserializar un objeto json de este tipo: {"valor": entero "," total ": 1", "registros": 138 "," filas ": [{" valor1 ": 6, "value2": verdadero, ...