it-swarm.com.de

Wie ist der Java Speicherpool aufgeteilt?

Ich überwache gerade eine Java mit jconsole. Auf der Registerkarte "Speicher" können Sie zwischen folgenden Optionen wählen:

Heap Memory Usage
Non-Heap Memory Usage
Memory Pool “Eden Space”
Memory Pool “Survivor Space”
Memory Pool “Tenured Gen”
Memory Pool “Code Cache”
Memory Pool “Perm Gen”

Was ist der Unterschied zwischen ihnen ?

211
Dani Cricco

Heap-Speicher

Der Heap-Speicher ist der Laufzeitdatenbereich, aus dem der Java VM) Speicher für alle Klasseninstanzen und Arrays zuweist. Der Heap kann eine feste oder variable Größe haben Der Garbage Collector ist ein automatisches Speicherverwaltungssystem, das Heapspeicher für Objekte zurückgewinnt.

  • Eden Space : Der Pool, aus dem für die meisten Objekte zunächst Speicher zugewiesen wird.

  • Survivor Space : Der Pool mit Objekten, die die Garbage Collection des Eden Space überlebt haben.

  • Tenured Generation oder Old Gen : Der Pool, der Objekte enthält, für die es existiert hat einige Zeit im Überlebensraum.

Nicht-Heap-Speicher

Nicht-Heap-Speicher enthält einen Methodenbereich, der von allen Threads und dem für die interne Verarbeitung oder Optimierung für die Java VM erforderlichen Speicher verwendet wird. Er speichert Strukturen pro Klasse, z. B. einen Laufzeitkonstantenpool, ein Feld und Methodendaten und der Code für Methoden und Konstruktoren. Der Methodenbereich ist logisch Teil des Heaps, aber je nach Implementierung kann ein Java VM nicht Garbage Collect oder Compact It. Wie der Heap-Speicher kann der Methodenbereich eine feste oder variable Größe haben. Der Speicher für den Methodenbereich muss nicht zusammenhängend sein.

  • Permanente Generierung : Der Pool, der alle reflektierenden Daten der virtuellen Maschine selbst enthält, z. B. Klassen- und Methodenobjekte. Mit Java VMs, die Class Data Sharing verwenden, wird diese Generation in Nur-Lese- und Schreib-Lese-Bereiche unterteilt.

  • Code-Cache : Der HotSpot Java VM= enthält auch einen Code-Cache, der enthält Speicher, der zum Kompilieren und Speichern von nativem Code verwendet wird.

Hier ist eine Dokumentation zur Verwendung von Jconsole .

313
dfa

Das neue Schlüsselwort reserviert Speicher auf dem Java heap. Der Heap ist der Hauptspeicherpool, auf den die gesamte Anwendung zugreifen kann. Wenn nicht genügend Speicher für dieses Objekt verfügbar ist, reserviert der JVM versucht, mit einer Garbage Collection Speicher aus dem Heap zurückzugewinnen.Wenn immer noch nicht genügend Speicher verfügbar ist, wird ein OutOfMemoryError ausgelöst und die JVM beendet.

Der Haufen ist in verschiedene Abschnitte unterteilt, die als Generationen bezeichnet werden. Da Objekte mehr Müllsammlungen überleben, werden sie in verschiedene Generationen befördert. Die älteren Generationen werden nicht so oft Müll gesammelt. Da sich diese Objekte bereits als längerlebig erwiesen haben, ist es weniger wahrscheinlich, dass sie als Müll gesammelt werden.

Wenn Objekte zum ersten Mal konstruiert werden, werden sie im Eden Space zugewiesen. Wenn sie eine Müllsammlung überleben, werden sie in den Survivor Space befördert. Sollten sie dort lange genug leben, werden sie der Tenured Generation zugewiesen. In dieser Generation wird viel seltener Müll gesammelt.

Es gibt auch eine vierte Generation namens Permanent Generation oder PermGen. Die Objekte, die sich hier befinden, sind nicht für die Garbage-Collection geeignet und enthalten normalerweise einen unveränderlichen Status, der für die Ausführung der JVM erforderlich ist, z. B. Klassendefinitionen und den String-Konstantenpool. Beachten Sie, dass der PermGen-Speicherplatz aus Java 8 entfernt werden soll und durch einen neuen Speicherplatz namens Metaspace ersetzt wird, der sich im systemeigenen Speicher befindet. Reference : http: //www.programcreek.com/2013/04/jvm-run-time-data-areas/

enter image description hereenter image description here

60
Pythoner

In Java8 enthält die Nicht - Heap - Region kein PermGen mehr, sondern Metaspace, eine wichtige Änderung in Java8, mit Java), da die Metaspace - Größe in Abhängigkeit von der Größe des Metaspace erhöht werden kann Speicherplatz, der von JVM für Klassendaten benötigt wird.

34
user2767149

Java-Heapspeicher ist Teil des Speichers, der JVM vom Betriebssystem zugewiesen wird.

Objekte befinden sich in einem Bereich, der als Haufen bezeichnet wird. Der Heap wird beim Start der JVM erstellt und kann während der Ausführung der Anwendung vergrößert oder verkleinert werden. Wenn der Haufen voll ist, wird Müll gesammelt.

enter image description here

Weitere Informationen zu Eden Space, Survivor Space, Tenured Space und Permanent Generation finden Sie in der folgenden SE-Frage:

Young, Tenured und Perm Generation

PermGen wurde seit der Version Java 8) durch Metaspace ersetzt.

Bezüglich Ihrer Fragen:

  1. Eden Space, Survivor Space und Tenured Space sind Teil des Haufengedächtnisses
  2. Metaspace und Code-Cache sind Teil des Nicht-Heap-Speichers.

Codecache: Die Java Virtual Machine (JVM) generiert systemeigenen Code und speichert ihn in einem als Codecache bezeichneten Speicherbereich. Die JVM generiert aus verschiedenen Gründen systemeigenen Code, darunter für die dynamisch generierte Interpreter-Schleife Java JNI) -Stubs und für Java) -Methoden werden vom Just-in-Time-Compiler (JIT) in systemeigenen Code kompiliert.Der JIT ist bei weitem der größte Benutzer des Codecaches.

19
Ravindra babu