2014-11-25 19 views
69

Bis Java 7 war ein Bereich, in JVM-Speicher PermGen genannt, wo JVM ihre Klassen zu halten verwendet. In Java 8 wurde es von Bereich metaSpace genannt entfernt und ersetzt.Was ist der Unterschied zwischen PermGen und Metaspace?

Was sind die wichtigsten Unterschiede zwischen PermGen und metaSpace? Der einzige Unterschied, den ich kenne, ist, dass java.lang.OutOfMemoryError: PermGen space nicht mehr ausgelöst werden kann und der VM-Parameter MaxPermSize ignoriert wird.

+0

erstem Google-Ergebnis eingeschränkt: http://www.infoq.com/articles/Java-PERMGEN-Removed – the8472

+0

@ the8472 Ja, aber diese (und viele andere) Google-Ergebnisse beschreiben nur den Metaspace-Mechanismus und erwähnen nichts über exakte Unterschiede zwischen diesem und PermGen. – Kao

Antwort

77

Der Hauptunterschied aus der Sicht der Nutzer - die ich die vorherige Antwort denken nicht genug betonen - ist, dass metaSpace standardmäßig automatisch erhöht seine Größe (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 kann nicht automatisch erhöht werden.

Zu einem großen Teil ist es nur eine Namensänderung. Damals, als PermGen eingeführt wurde, gab es keine Java EE oder dynamische Klasse (un) Laden, so dass, sobald eine Klasse geladen wurde es im Speicher stecken geblieben war, bis die JVM herunterfahren - so 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 gespeichert werden, sinnvoller.

Beide enthalten die java.lang.Class Instanzen und beide leiden unter ClassLoader leaks. Der einzige Unterschied besteht darin, dass es bei Metaspace-Standardeinstellungen länger dauert, bis Sie die Symptome bemerken (da es automatisch so viel wie möglich erhöht), d. H. Sie schieben das Problem einfach weiter weg, ohne es zu lösen. OTOH Ich kann mir vorstellen, dass die Auswirkungen des OS-Arbeitsspeichers schwerwiegender sein können, als dass JVM PermGen nicht mehr verfügbar ist. Daher bin ich mir nicht sicher, ob es sich um eine Verbesserung handelt.

Unabhängig davon, ob Sie eine JVM mit PermGen oder mit Metaspace verwenden, sollten Sie beim Entladen der dynamischen Klasse Maßnahmen gegen Undichtigkeiten von Classloader ergreifen, z. B. indem Sie meine ClassLoader Leak Prevention library verwenden.

+3

Weder Permgen noch Metaspace enthalten Instanzen der Klasse Class. Sie behalten nur Metainformationen über geladene Klassen. Instanzen der Klasse Class werden wie andere Klassen in einem regulären Heap gespeichert. –

+0

Schöner Vergleich. Vielen Dank – Sandeep

23

Bye, Bye PermGen, hallo metaSpace

PermGen vollständig entfernt wurde.

metaSpace Garbage Collection - Garbage Collection der toten Klassen und Klassenladeprogramme ausgelöst wird, sobald die Klasse Metadaten Nutzung der MaxMetaspaceSize erreicht.

Der Raum Metadata gehalten wurde, ist nicht länger angrenzend an den Java heap, The metadata nun zu nativem Speicher auf eine Fläche wie die Metaspace bekannt bewegt hat.

In einfachen Worten,

Da die Klasse Metadaten aus nativen Speicher, die maximale verfügbare Speicherplatz ist der gesamte verfügbare Speicher-System zugeordnet ist. Daher werden Sie nicht mehr auf OOM errors stoßen und könnten in den Swap-Bereich gelangen.

Die Entfernung von PermGen bedeutet nicht, dass Ihre Leck Probleme Class-Loader sind verschwunden. Also, ja, Sie müssen immer noch Ihren Verbrauch überwachen und entsprechend planen, da ein Leck Ihren gesamten nativen Speicher verbrauchen würde.

Einige andere Artikel, mit Analyse: Link1, Link2 und this

+6

Anstelle von MaxPermGen haben Sie MaxMetaspaceSize, also gibt es keinen Grund, dass mehr oder weniger Speicher verwendet wird oder Sie weniger Kontrolle haben. –

5

Kurz gesagt, metaSpace Größe Auto steigt im nativen Speicher nach Bedarf Klasse Metadaten zu laden, wenn nicht mit -XX:MaxMetaspaceSize