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 .