Qualcuno sa perché java 7 non riesce a raccogliere la generazione permanente di app, con conseguente java.lang.OutOfMemoryError: PermGen, mentre java 5 raccoglie la generazione permanente e le esecuzioni dell'app bene?Java 7 non riesce a raccogliere la generazione permanente che viene raccolta da java 5
App esegue la valutazione delle espressioni jython nel ciclo, una iterazione è di ca. 5 sec. corpo del ciclo appare come:
PythonInterpreter py = new PythonInterpreter();
py.set("AI", 1);
((PyInteger)py.eval(expr)).getValue()
Screenshots di jvisual vm presi per applicazione in esecuzione in Java 7 e Java 5.
In entrambi i casi vengono utilizzati gli stessi parametri:
-Xmx700m
-XX:MaxPermSize=100m
-XX:+HeapDumpOnOutOfMemoryError
-Xloggc:"C:\Temp\gc.log" -XX:+PrintGCDetails -XX:-TraceClassUnloading -XX:+PrintClassHistogram
Hai controllato gli algoritmi gc accedendo a JConsole o qualche altro strumento? – kosa
Potrebbero esserci impostazioni di avvio JVM diverse. C'è qualcosa di insolito nella tua applicazione? come codice di caricamento a caldo, caricatori di classi personalizzate ecc.? – Andy
Le persone di GC stanno sempre modificando il GC, cercando disperatamente di migliorare le prestazioni, quindi non sono sorpreso che ci sia una tale differenza. La mia __guess__ è che ora sono focalizzati sul 700Mb piuttosto che sul 100Mb e stanno lasciando espandere la memoria permanente piuttosto che impiegare lo sforzo per controllarlo. Sono focalizzati sulle alte prestazioni e restano entro 700Mb piuttosto che buoni numeri per PermGen. – RalphChapin