Ich überwache derzeit eine Java-Anwendung mit jconsole. Auf der Registerkarte Speicher können Sie wählen zwischen:
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 ?
Antworten:
Heapspeicher
Der Heapspeicher ist der Laufzeitdatenbereich, aus dem die 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 der Speicher zunächst für die meisten Objekte zugewiesen wird.
Survivor Space : Der Pool mit Objekten, die die Speicherbereinigung des Eden Space überlebt haben.
Tenured Generation oder Old Gen : Der Pool, der Objekte enthält, die seit einiger Zeit im Überlebensraum existieren.
Nicht-Heap-Speicher
Nicht-Heap-Speicher enthält einen Methodenbereich, der von allen Threads und dem Speicher gemeinsam genutzt wird, die für die interne Verarbeitung oder Optimierung der Java-VM erforderlich sind. Es speichert klassenbezogene Strukturen wie einen Laufzeitkonstantenpool, Feld- und Methodendaten sowie den Code für Methoden und Konstruktoren. Der Methodenbereich ist logisch Teil des Heaps, aber abhängig von der Implementierung kann eine Java-VM ihn möglicherweise nicht durch Speicherbereinigung sammeln oder komprimieren. 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. Bei Java-VMs, die die gemeinsame Nutzung von Klassendaten verwenden, ist diese Generation in schreibgeschützte und schreibgeschützte Bereiche unterteilt.
Code-Cache : Die HotSpot Java VM enthält auch einen Code-Cache, der Speicher enthält, der zum Kompilieren und Speichern von nativem Code verwendet wird.
Hier finden Sie eine Dokumentation zur Verwendung von Jconsole .
quelle
Das neue Schlüsselwort weist Speicher auf dem Java-Heap zu. Der Heap ist der Hauptspeicherpool, auf den die gesamte Anwendung zugreifen kann. Wenn nicht genügend Speicher für dieses Objekt verfügbar ist, versucht die JVM, mit einer Garbage Collection Speicher vom Heap zurückzugewinnen. Wenn immer noch nicht genügend Speicher verfügbar ist, wird ein OutOfMemoryError ausgelöst und die JVM wird beendet.
Der Heap ist in verschiedene Abschnitte unterteilt, die als Generationen bezeichnet werden. Wenn 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 zugeordnet. Diese Generation ist Müll, der viel seltener gesammelt wird.
Es gibt auch eine vierte Generation, die permanente Generation oder PermGen. Die Objekte, die sich hier befinden, können nicht durch Speicherbereinigung erfasst werden 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 im nativen Speicher gespeichert wird. Referenz: http://www.programcreek.com/2013/04/jvm-run-time-data-areas/
quelle
-XX:PermSize
und nicht so,-XX:MaxPermSize
wie es bereits oben definiert ist.Mit Java8 enthält die Nicht-Heap-Region nicht mehr PermGen, sondern Metaspace, eine wichtige Änderung in Java8, die Speicherfehler mit Java beseitigen soll, da die Größe des Metaspace abhängig vom von jvm für Klassendaten benötigten Speicherplatz erhöht werden kann.
quelle
Der Java-Heapspeicher ist Teil des Speichers, der vom Betriebssystem der JVM zugewiesen wird.
Objekte befinden sich in einem Bereich, der als Heap 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.
Weitere Details zu Eden Space, Survivor Space, Tenured Space und Permanent Generation finden Sie in der folgenden SE-Frage:
Junge, Tenured und Perm Generation
PermGen wurde seit Java 8 durch Metaspace ersetzt.
In Bezug auf Ihre Fragen:
Codecache: Die Java Virtual Machine (JVM) generiert nativen Code und speichert ihn in einem Speicherbereich, der als Codecache bezeichnet wird. Die JVM generiert nativen Code aus verschiedenen Gründen, einschließlich für die dynamisch generierte Interpreterschleife, JNI-Stubs (Java Native Interface) und für Java-Methoden, die vom Just-in-Time-Compiler (JIT) in nativen Code kompiliert werden. Die JIT ist bei weitem der größte Benutzer des Codecaches.
quelle