Permgen vs Metaspace in Java

1. Einleitung

In diesem kurzen Tutorial werden wir die Unterschiede zwischen den Speicherbereichen PermGen und Metaspace in der Java-Umgebung untersuchen.

Es ist wichtig zu beachten, dass der Metaspace ab Java 8 das PermGen ersetzt und einige wesentliche Änderungen mit sich bringt.

2. PermGen

PermGen (Permanent Generation) ist ein spezieller Heap-Bereich, der vom Hauptspeicher-Heap getrennt ist .

Die JVM verfolgt die geladenen Klassenmetadaten im PermGen. Darüber hinaus speichert die JVM den gesamten statischen Inhalt in diesem Speicherbereich. Dies umfasst alle statischen Methoden, primitiven Variablen und Verweise auf die statischen Objekte.

Darüber hinaus enthält es Daten zu Bytecode, Namen und JIT-Informationen . Vor Java 7 war auch der String Pool Teil dieses Speichers. Die Nachteile der festen Poolgröße sind in unserer Beschreibung aufgeführt.

Die standardmäßige maximale Speichergröße für 32-Bit-JVM beträgt 64 MB und für die 64-Bit-Version 82 MB.

Wir können jedoch die Standardgröße mit den JVM-Optionen ändern:

  • -XX: PermSize = [Größe] ist die anfängliche oder minimale Größe des PermGen-Bereichs
  • -XX: MaxPermSize = [Größe] ist die maximale Größe

Am wichtigsten ist, dass Oracle diesen Speicherplatz in der JDK 8-Version vollständig entfernt hat. Wenn wir diese Optimierungsflags in Java 8 und neueren Versionen verwenden, erhalten wir daher die folgenden Warnungen:

>> java -XX:PermSize=100m -XX:MaxPermSize=200m -version OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0 OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0 ...

Mit seiner begrenzten Speichergröße ist PermGen an der Generierung des berühmten OutOfMemoryError beteiligt . Einfach ausgedrückt, die Klassenlader wurden nicht ordnungsgemäß gesammelt und verursachten infolgedessen einen Speicherverlust.

Daher erhalten wir einen Speicherplatzfehler. Dies geschieht hauptsächlich in der Entwicklungsumgebung beim Erstellen neuer Klassenlader.

3. Metaspace

Einfach ausgedrückt ist Metaspace ein neuer Speicherplatz - ab der Java 8-Version; Es hat den älteren PermGen-Speicherplatz ersetzt . Der wichtigste Unterschied besteht darin, wie mit der Speicherzuweisung umgegangen wird.

Insbesondere wächst dieser native Speicherbereich standardmäßig automatisch .

Wir haben auch neue Flags, um den Speicher abzustimmen:

  • MetaspaceSize und MaxMetaspaceSize - Wir können die oberen Grenzen von Metaspace festlegen.
  • MinMetaspaceFreeRatio - ist der Mindestprozentsatz der Kapazität von Klassenmetadaten, die nach der Speicherbereinigung frei ist
  • MaxMetaspaceFreeRatio - ist der maximale Prozentsatz der Kapazität von Klassenmetadaten, die nach einer Speicherbereinigung frei ist, um eine Reduzierung des Speicherplatzes zu vermeiden

Darüber hinaus profitiert der Garbage Collection-Prozess von dieser Änderung. Der Garbage Collector löst jetzt automatisch die Bereinigung der toten Klassen aus, sobald die Verwendung der Klassenmetadaten ihre maximale Metaspace-Größe erreicht hat.

Daher mit dieser Verbesserung reduziert JVM die Chance , das bekommen OutOfMemory Fehler .

Trotz all dieser Verbesserungen müssen wir den Metaspace weiterhin überwachen und optimieren, um Speicherlecks zu vermeiden.

4. Zusammenfassung

In diesem kurzen Artikel haben wir eine kurze Beschreibung der Speicherbereiche von PermGen und Metaspace vorgestellt. Zusätzlich haben wir die wichtigsten Unterschiede zwischen den einzelnen erläutert.

PermGen gibt es immer noch mit JDK 7 und älteren Versionen, aber Metaspace bietet eine flexiblere und zuverlässigere Speichernutzung für unsere Anwendungen.