2010-09-26 2 views
33

Ich habe gelesen, dass Perm gen (oder Permanent Generation) Speicherplatz ist nicht Müll gesammelt. Bei der CMS-Sammlung kann ich jedoch feststellen, dass einige Klassen in meinem GC-Protokoll entladen werden. Wird während der gesamten Sammlung oder CMS-Sammlung also Dauermüll gesammelt?In Java wird Permanent Generation Speicherplatz Müll gesammelt?

+0

Mögliche Duplikat http://stackoverflow.com/questions/88235/how-to-deal-with -java-lang-outofmemoryerror-permgen-Leerzeichenfehler? Wie auch immer, überprüfen Sie diesen Thread, es wird Ihnen sicher helfen. –

+1

nein es ist überhaupt nicht dupliziert. Dies ist eine Konzeptfrage, die nach Ja/Nein-Antwort fragt, nicht nach einer Lösung, die nach einem Fehler sucht. – YudhiWidyatama

Antwort

32

Der PermGen ist Müll gesammelt wie die anderen Teile des Heaps.

Die hier zu beachtende Sache ist, dass das PermGen Metadaten der Klassen und der Objekte enthält, d.h. Zeiger in den Rest des Heapspeichers, wo die Objekte zugewiesen sind. Der PermGen enthält auch Klassenlader, die am Ende ihrer Verwendung manuell zerstört werden müssen, ansonsten bleiben sie im Speicher und enthalten auch Referenzen auf ihre Objekte auf dem Heap. Der Artikel "Presenting the Permanent Generation" von Jon Masamitsu auf der Sun/Oracle-Blogseite könnte Ihnen dabei helfen.

+0

Was war der Blogeintrag zur Sonne? Link funktioniert nicht ... –

+2

Korrigiert. Es war ein Sun-Blog, also ist es jetzt ein Oracle-Blog :) –

+4

Ich habe den Titel und den Autor eingebunden, damit Leute es finden können, wenn die Verbindung wieder bricht. –

27

In aktuellen Generation JVMs wird Permgen in der Tat wie andere Teile des Heaps gesammelt. Die visualgc Seite besagt, dass es zusammen mit der alten Generation gesammelt wird.

In älteren JVMs war das anscheinend nicht immer so. Zum Beispiel in Java 5 der CMS-Kollektor anscheinend PerMGen nicht standardmäßig gesammelt: Sie könnten es mit -XX:+CMSPermGenSweepingEnabled aktivieren. Ich erinnere mich auch zu hören, dass einige wirklich alte JVMs die Permgen-Sammlung überhaupt nicht implementiert haben, obwohl ich keine zuverlässige Quelle dafür finden kann ... erm ... "factoid".

Der andere Punkt, ist, dass viele Leute haben falsch zugeschrieben "OutOfMemoryError: permgen" Ausnahmen zu Permgen überhaupt nicht gesammelt werden. Die Realität ist anders. Die häufigste Ursache dieser OOMEs ist eine heimtückische Art von Speicherleck, die sich beim Warmladen von Code in eine ausführende JVM manifestiert. Das Leck tritt auf, wenn eine Instanz einer alten Klasse, die ersetzt wurde, erreichbar bleibt. Dies bewirkt, dass die Klasse des Objekts erreichbar ist, wodurch der Klasse-Klassenlader erreichbar ist, was bewirkt, dass alle der alten Klassen zusammen mit ihren Code-Objekten, ihren String-Literalen und ihren statischen Rahmen und statisch erreichbar sind. Viele dieser durchgesickerten Objekte leben im Permgenraum.


UPDATE

Ab Java 8, Permgen nicht mehr existiert: PermGen elimination in JDK 8