Ho questo codice per generare classe in modo dinamico e caricarloJava8 metaspace & mucchio utilizzo
import javassist.CannotCompileException;
import javassist.ClassPool;
public class PermGenLeak {
private static final String PACKAGE_NAME = "com.jigarjoshi.permgenleak.";
public static void main(String[] args) throws CannotCompileException, InterruptedException {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
ClassPool pool = ClassPool.getDefault();
pool.makeClass(PACKAGE_NAME + i).toClass();
Thread.sleep(3);
}
}
}
ho lanciato questa classe contro Java 7 (jdk1.7.0_60) e come previsto è riempito PermGenSpace e heap è rimasto inutilizzato immagine mostra PermGen straordinari utilizzo e alla JVM fine è stato terminato
Ora lo stesso codice ha funzionato contro Java 8 (jdk1.8.0_40-bis) e come previsto ha mantenuto espansione di memoria nativa (Metaspace) ma sorprendentemente per 1g di Metaspace ha consumato 3g di Heap in OldGen (almos t 3x di Metaspace mantenuta nel tempo)
immagine mostra l'utilizzo Metaspace straordinari e campione utilizzo della memoria di sistema
this email from Jon Masamitsu e this JEP ticket dice
internati
String
e Classe statistiche e alcuni dati misc ha stato spostato su Heap
cosa fa esattamente questo aumento di heap mentre carica più classi in Metaspace?
Grazie Andrei, avrei dovuto solo eseguire questo, penso che non ho raggiunto a questa scala in Java 7 esempio è per questo che non l'ho visto in Java 7 –