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 space
nicht mehr ausgelöst werden kann und der VM-Parameter MaxPermSize
ignoriert wird.
Antworten:
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.Class
Instanzen 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 .
quelle
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,
Metadata
der gehalten wurde, grenzt nicht mehr an denJava heap
, dermetadata
ist jetzt in die native Erinnerung in einen Bereich umgezogen, der als der bekannt istMetaspace
.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 errors
und könnten in den Swap-Bereich gelangen.Das Entfernen von
PermGen
bedeutet 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
quelle
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
quelle