Wann wird die Perm gen gesammelt?

9

Ich arbeite an einer Tomcat-Anwendung, die den CMS-Kollektor zusammen mit einer Speicherleiste verwendet, um GC auszulösen. Wenn ich Webapps neu lade, lande ich manchmal in einer Situation, in der das Alte Gen voll genug ist, um GC auszulösen, aber die toten Classloader nicht gesammelt werden.

Ich habe gelesen, dass Klassen in die Dauerwelle eingeteilt werden und vermuteten, dass sie daher von den Sammlungen des alten Genus ignoriert wurden. Ich habe die folgende Testklasse geschrieben, um diese Theorie zu testen.

%Vor%

Ich habe diese Klasse ausgeführt und die Ausgabe mit VisualVM überwacht und gesehen, dass es tatsächlich mehrere Alt- und Young-Gen-Sammlungen gab, ohne dass der tote Classloader gesammelt wurde und daher das große Byte-Array im Speicher blieb.

Was würde die Perm Gen auslösen?

    
mchr 05.11.2011, 00:15
quelle

1 Antwort

4

Überprüfen Sie die JVM-Optionen "CMSPermGenSweepingEnabled" und "CMSClassUnloadingEnabled". (Es gibt viele Diskussionen im Netz, um sie zu verwenden.) Insbesondere wird angenommen, dass der PermGen in einen Garbage-Collection-Lauf eingeschlossen wird. Standardmäßig ist der PermGen-Bereich niemals in der Garbage Collection enthalten (und wächst somit unbegrenzt).

    
mazaneicha 05.11.2011, 00:29
quelle