Was ist der Unterschied zwischen PermGen und Metaspace?

118

Bis Java 7 gab es im JVM-Speicher einen Bereich namens PermGen , in dem JVM seine Klassen behielt . In Java 8 wurde es entfernt und durch einen Bereich namens Metaspace ersetzt .

Was sind die wichtigsten Unterschiede zwischen PermGen und Metaspace?

Der einzige Unterschied, den ich kenne, ist, dass er java.lang.OutOfMemoryError: PermGen spacenicht mehr ausgelöst werden kann und der VM-Parameter MaxPermSizeignoriert wird.

Kao
quelle
erstes Google-Ergebnis: infoq.com/articles/Java-PERMGEN-Removed
the8472
@ the8472 Ja, aber diese (und viele andere) Google-Ergebnisse beschreiben nur den Metaspace-Mechanismus und erwähnen nichts über die genauen Unterschiede zwischen diesem und PermGen.
Kao

Antworten:

137

Der Hauptunterschied aus Anwendersicht - was meiner Meinung nach in der vorherigen Antwort nicht genug betont wird - besteht darin, dass Metaspace seine Größe standardmäßig automatisch erhöht (bis zu dem, was das zugrunde liegende Betriebssystem bietet), während PermGen immer eine feste maximale Größe hat. Sie können ein festes Maximum für Metaspace mit JVM-Parametern festlegen, aber PermGen nicht automatisch erhöhen.

Zu einem großen Teil ist es nur eine Namensänderung. Als PermGen eingeführt wurde, wurde weder Java EE noch eine dynamische Klasse (un) geladen. Sobald eine Klasse geladen war, blieb sie im Speicher stecken, bis die JVM heruntergefahren wurde - also Permanent Generation. Heutzutage können Klassen während der Lebensdauer der JVM geladen und entladen werden. Daher ist Metaspace für den Bereich, in dem die Metadaten aufbewahrt werden, sinnvoller.

Beide enthalten die java.lang.ClassInstanzen und beide leiden unter ClassLoader-Lecks . Der einzige Unterschied besteht darin, dass es bei den Metaspace-Standardeinstellungen länger dauert, bis Sie die Symptome bemerken (da sie automatisch so stark wie möglich zunehmen), dh Sie schieben das Problem einfach weiter weg, ohne es zu lösen. OTOH Ich stelle mir vor, dass der Effekt, wenn der Betriebssystemspeicher knapp wird, schwerwiegender sein kann als nur der Verlust von JVM PermGen. Daher bin ich mir nicht sicher, ob dies eine große Verbesserung darstellt.

Unabhängig davon, ob Sie eine JVM mit PermGen oder mit Metaspace verwenden, sollten Sie beim dynamischen Entladen von Klassen Maßnahmen gegen Classloader-Lecks ergreifen, z. B. mithilfe meiner ClassLoader Leak Prevention-Bibliothek .

Mattias Jiderhamn
quelle
17
Weder Permgen noch Metaspace enthalten Instanzen der Klassenklasse. Sie speichern nur Metainformationen über geladene Klassen. Instanzen der Klasse Class werden wie Instanzen anderer Klassen in einem regulären Heap gespeichert.
Durchschnittlicher Joe
Schöner Vergleich. Vielen Dank
Sandeep
1
Übrigens bedeutet OTOH "Auf der anderen Seite"
sofs1
43

Tschüss, Tschüss PermGen, Hallo Metaspace

PermGen wurde vollständig entfernt.

Metaspace-Speicherbereinigung - Die Speicherbereinigung der toten Klassen und Klassenladeprogramme wird ausgelöst, sobald die Verwendung der Klassenmetadaten die erreicht MaxMetaspaceSize.

Der Raum, Metadatader gehalten wurde, grenzt nicht mehr an den Java heap, der metadataist jetzt in die native Erinnerung in einen Bereich umgezogen, der als der bekannt ist Metaspace.

In einfachen Worten ,

Da die Klassenmetadaten aus dem nativen Speicher zugewiesen werden, ist der maximal verfügbare Speicherplatz der insgesamt verfügbare Systemspeicher. Auf diese Weise werden Sie nicht mehr begegnen OOM errorsund könnten in den Swap-Bereich gelangen.

Das Entfernen von PermGenbedeutet nicht, dass die Probleme mit dem Klassenladerleck behoben sind. Ja, Sie müssen Ihren Verbrauch weiterhin überwachen und entsprechend planen, da ein Leck Ihren gesamten nativen Speicher verbrauchen würde.

Einige andere Artikel mit Analyse: Link1 , Link2 und dies

Ankur Singhal
quelle
6
Anstelle von MaxPermGen haben Sie MaxMetaspaceSize, es gibt also keinen Grund, warum mehr oder weniger Speicher benötigt wird oder Sie weniger Kontrolle haben.
Peter Lawrey
2
Über welche Erinnerung sprechen wir hier? RAM-Speicher oder HDD-Speicher.
Dinesh
1
@ Dinesh RAM (interner Speicher)
Aditya Gupta
10

Kurz gesagt, die Größe des Metaspace erhöht sich automatisch im nativen Speicher, wenn dies zum Laden von Klassenmetadaten erforderlich ist, wenn dies nicht eingeschränkt ist -XX:MaxMetaspaceSize

Chandrasekaran
quelle