PermGen-Eliminierung in JDK 8

229

Ich habe JDK 8 installiert und versucht, Eclipse auszuführen. Ich erhalte folgende Warnmeldung:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0 

Was sind die Gründe, diese VM-Option zu ignorieren?

Shamim Ahmmed
quelle
4
Sie finden dies möglicherweise informativ: javaeesupportpatterns.blogspot.co.uk/2013/02/…
Andrew Martin

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

pardeep131085
quelle
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
117

Dies ist eine der neuen Funktionen von Java 8, Teil der JDK-Verbesserungsvorschläge 122 :

Entfernen Sie die permanente Generation aus der Hotspot-JVM und müssen Sie daher die Größe der permanenten Generation anpassen.

Die Liste aller JEPs, die in Java 8 enthalten sein werden, finden Sie auf der Seite mit den JDK8-Meilensteinen .

Assylien
quelle
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 >>

Dhrumil Shah
quelle
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
16

Weil der PermGen-Speicherplatz entfernt wurde. Die Speicherverwaltung hat sich etwas geändert.

Java-8-Permgen-Metaspace

Sebastian Redl
quelle
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.

Shubham Pandey
quelle
9

Die JVM-Implementierung von Oracle für Java 8 hat das PermGen-Modell entfernt und durch Metaspace ersetzt .

chrylis -vorsichtig optimistisch-
quelle