PermGen Eliminierung in JDK 8

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, dieses Argument zu ignorieren?

Gründe für das Ignorieren dieser Argumente sind die permanente Generierung in HotSpot für JDK8 wegen folgender Nachteile

  • Feste Größe beim Start – schwer zu tunen.
  • Interne Hotspot-Typen waren Java-Objekte: Konnte sich mit vollem GC bewegen, undurchsichtig, nicht stark typisiert und schwer zu debuggen, benötigte Meta-Metadaten.
  • Vereinfachen Sie vollständige Sammlungen: Spezielle Iteratoren für Metadaten für jeden Kollektor
  • Sie möchten die classndaten gleichzeitig und nicht während der GC-Pause freigeben
  • Ermöglichen Sie zukünftige Verbesserungen, die durch PermGen begrenzt wurden.

Der Permanent Generation (PermGen) -Raum wurde komplett entfernt und wird durch einen neuen Raum namens Metaspace ersetzt. Die Folgen der Entfernung von PermGen ist, dass offensichtlich die JVM-Argumente PermSize und MaxPermSize ignoriert werden und Sie nie einen java.lang.OutOfMemoryError: PermGen-Fehler erhalten werden.

Vorteile von MetaSpace

  • Profitieren Sie von der Java-Sprachspezifikationseigenschaft: classn und die zugehörigen Metadatenlebensdauern stimmen mit classnladeprogrammen überein
  • Pro Ladespeicherbereich – Metaspace
  • Nur lineare Zuweisung
  • Keine individuelle Reklamation (außer RedefineClasses und classnladeerrors)
  • Kein GC-Scan oder Komprimierung
  • Keine Verschiebung für Metaspace-Objekte

Metaspace-Tuning

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

Change ermöglicht andere Optimierungen und functionen in der Zukunft

  • Anwendungsklassen-Datenfreigabe
  • Junge Kollektionsoptimierungen, G1-class Entladen
  • Reduzierung der Metadatengröße und interne JVM-Footprint-Projekte

Es gibt auch eine verbesserte GC-performance. Mehr Details

Dies ist eine der neuen functionen von Java 8, Teil von JDK Enhancement Proposals 122 :

Entfernen Sie die permanente Generation von der Hotspot-JVM und damit die Notwendigkeit, die Größe der permanenten Generation zu optimieren.

Die Liste aller GEPs, die in Java 8 enthalten sind, finden Sie auf der JDK8-Meilenstein-Seite .

Der permanente Generierungsraum (PermGen) wurde vollständig entfernt und wird durch einen neuen Raum namens Metaspace ersetzt. Die Folgen der Entfernung von PermGen ist, dass offensichtlich die JVM-Argumente PermSize und MaxPermSize ignoriert werden und Sie niemals eine java.lang.OutOfMemoryError : PermGen Fehler. Die JDK 8 HotSpot JVM verwendet jetzt nativen Speicher für die Darstellung von classnmetadaten und heißt Metaspace. Lesen Sie mehr >>

Weil der PermGen-Bereich entfernt wurde. Das Speichermanagement hat sich ein wenig verändert.

http://java.dzone.com/articles/java-8-permgen-metaspace

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

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

Der Hauptunterschied zwischen dem alten PermGen und dem neuen MetaSpace besteht darin, dass Sie die obere Grenze der Speichernutzung nicht zwingend definieren müssen. Sie können den Speicherplatzgrenzwert für MetaSpace unbegrenzt beibehalten. Wenn die Speicherbelegung steigt, erhalten Sie daher keinen OutOfMemoryError-Fehler. Stattdessen wird der reservierte native Speicher erhöht, um die Speichererweiterung zu erhöhen.

Sie können das maximale Speicherplatzlimit für MetaSpace definieren und anschließend OutOfMemoryError: Metadata space auslösen. Daher ist es wichtig, diese Grenze vorsichtig zu definieren, um Speicherverschwendung zu vermeiden.

Die JVM-Implementierung von Oracle für Java 8 triggerse das PermGen-Modell und ersetzte es durch Metaspace .