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.
erstem Google-Ergebnis eingeschränkt: http://www.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 exakte Unterschiede zwischen diesem und PermGen. – Kao