PermGen-Eliminierung in JDK 8


Antworten:


358

Gründe für das Ignorieren dieses Arguments sind, dass die permanente Generierung in HotSpot für JDK8 aufgrund der folgenden Nachteile entfernt wurde

  • Feste Größe beim Start - schwer einzustellen.
  • Interne Hotspot-Typen waren Java-Objekte: Konnte mit vollem GC verschoben werden, undurchsichtig, nicht stark typisiert und schwer zu debuggen, benötigte Metametadaten.
  • Vereinfachen Sie vollständige Sammlungen: Spezielle Iteratoren für Metadaten für jeden Kollektor
  • Sie möchten die Freigabe von Klassendaten gleichzeitig und nicht während der GC-Pause freigeben
  • Aktivieren Sie zukünftige Verbesserungen, die durch PermGen eingeschränkt wurden.

Der PermGen-Bereich (Permanent Generation) wurde vollständig entfernt und durch einen neuen Bereich namens Metaspace ersetzt. Die Entfernung von PermGen hat zur Folge, dass die JVM-Argumente PermSize und MaxPermSize offensichtlich ignoriert werden und Sie niemals den Fehler java.lang.OutOfMemoryError: PermGen erhalten.

Vorteile von MetaSpace

  • Nutzen Sie die Eigenschaft Java Language Specification: Klassen und zugehörige Metadatenlebensdauern stimmen mit denen von Klassenladeprogrammen überein
  • Speicherbereich pro Lader - Metaspace
  • Nur lineare Zuordnung
  • Keine individuelle Reklamation (außer RedefineClasses und Fehler beim Laden der Klasse)
  • Kein GC-Scan oder Verdichtung
  • Kein Umzug für Metaspace-Objekte

Metaspace-Tuning

Die maximale Metaspace-Größe kann mit dem Flag -XX: MaxMetaspaceSize festgelegt werden. Der Standardwert ist unbegrenzt. Dies bedeutet, dass nur Ihr Systemspeicher das Limit darstellt. Das Optimierungsflag -XX: MetaspaceSize definiert die anfängliche Größe von Metaspace. Wenn Sie dieses Flag nicht angeben, wird die Größe des Metaspace abhängig von der Anwendungsanforderung zur Laufzeit dynamisch geändert.

Änderungen ermöglichen in Zukunft weitere Optimierungen und Funktionen

  • Datenfreigabe für Anwendungsklassen
  • Junge Sammlungsoptimierungen, Entladen der G1-Klasse
  • Reduzierung der Metadatengröße und interne JVM-Footprint-Projekte

Es gibt auch eine verbesserte GC-Leistung. Mehr Details


29
Ich sollte erwähnen, dass internierte Zeichenfolgen zuvor im PermGen-Bereich gespeichert waren, aber in Java 7 auf den Haupt-Java-Heap
verschoben wurden

Danke für die ausführliche Erklärung.
Pradeep

3
Eine sanfte Einführung für das allgemeine Publikum (ich meine hauptsächlich Nicht-Java-Leute, z. B. andere Entwickler, die sich mit JVM befassen müssen) würde dieser Antwort nicht schaden.
Ulidtko


19

Der PermGen-Bereich (Permanent Generation) wurde vollständig entfernt und durch einen neuen Bereich namens Metaspace ersetzt. Die Konsequenz der PermGen-Entfernung ist, dass die JVM-Argumente PermSize und MaxPermSize offensichtlich ignoriert werden und Sie niemals den java.lang.OutOfMemoryErrorFehler PermGen erhalten. Die JDK 8 HotSpot-JVM verwendet jetzt nativen Speicher für die Darstellung von Klassenmetadaten und heißt Metaspace. Lesen Sie mehr >>


3
'HotSpot JVM verwendet jetzt nativen Speicher für die Darstellung von Klassenmetadaten. - und welchen Speicher hat HotSpot JVM zuvor verwendet? Und was ist die "native Erinnerung" genau?
Andrey M. Stepanov


12

Der PermGen-Speicherplatz wird in Java 8 durch MetaSpace ersetzt. Die JVM-Argumente PermSize und MaxPermSize werden ignoriert und eine Warnung wird ausgegeben, wenn sie beim Start vorhanden ist.

Die meisten Zuordnungen für die Klassenmetadaten werden jetzt aus dem nativen Speicher zugewiesen. * Die Klassen, die zur Beschreibung von Klassenmetadaten verwendet wurden, wurden entfernt.

Der Hauptunterschied zwischen altem PermGen und neuem MetaSpace besteht darin, dass Sie nicht zwingend die Obergrenze der Speichernutzung definieren müssen. Sie können das MetaSpace-Speicherplatzlimit unbegrenzt lassen. Wenn also die Speichernutzung zunimmt, wird kein OutOfMemoryError-Fehler angezeigt. Stattdessen wird der reservierte native Speicher erhöht, um die erhöhte Speichernutzung vollständig auszufüllen.

Sie können die maximale Speicherplatzbeschränkung für MetaSpace definieren. Anschließend wird OutOfMemoryError: Metadata Space ausgegeben. Daher ist es wichtig, diese Grenze vorsichtig zu definieren, um Speicherverschwendung zu vermeiden.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.