Wie ist der Java-Speicherpool aufgeteilt?
Ich bin derzeit auf der überwachung einer Java-Anwendung mit jconsole. Der tab "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 ?
InformationsquelleAutor der Frage Dani Cricco | 2009-08-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Heap-Speicher
Den heap-Speicher der runtime-Datenbereich, aus dem die Java-VM reserviert Speicher für alle Klasseninstanzen und arrays. Der heap kann eine Feste oder eine variable Größe. Der garbage collector ist ein automatisches memory-management-system, dass Rückforderungen heap-Speicher für Objekte.
Eden Raum: Der pool, aus dem Speicher wird zunächst zugeordnet, für die meisten Objekte.
Survivor Space: Der pool mit Objekten, die überlebt haben, die garbage collection des Eden space.
Pragmatisierte Generation oder Alten Gen: Der pool mit Objekten, die seit einiger Zeit in den survivor space.
Non-heap-Speicher
Non-heap-Speicher enthält eine Methode area, die gemeinsam von allen threads und Speicher, die benötigt werden für die interne Verarbeitung oder-Optimierung für die Java VM. Es speichert pro Klasse Strukturen wie eine Laufzeit-Konstanten-pool, Feld und Methode die Daten, und der code für Methoden und Konstruktoren. Die Methode, die Fläche ist logisch Teil des Heaps, die aber, je nach Implementierung, eine Java-VM kann nicht Müll sammeln oder zu verdichten. Wie der heap-Speicher, die Methode Bereich kann eine Feste oder eine variable Größe. Der Speicher für die Methode, die Fläche muss nicht zusammenhängend sein.
Die permanente Generierung: Der pool mit den reflektierenden Daten, die von der virtuellen Maschine selbst, wie class und method-Objekte. Mit Java-VMs, die Klasse Daten-sharing, diese generation ist unterteilt in read-only und read-write Bereiche.
Code Cache: Der HotSpot Java VM enthält auch einen code cache, mit Speicher, die verwendet wird, für die Zusammenstellung und Lagerung von nativen code.
Hier einige Unterlagen, wie Jconsole.
InformationsquelleAutor der Antwort dfa
Dem Schlüsselwort new reserviert Speicher auf dem Java-heap. Der heap ist der Haupt-pool-Speicher,zugänglich für die gesamte Anwendung. Wenn es ist nicht genügend Arbeitsspeicher verfügbar, reservieren Sie für dieses Objekt die JVM versucht zu reklamieren, einige Speicher aus dem heap mit garbage-collection. Wenn es immer noch nicht erhalten, genug Speicher, ein OutOfMemoryError geworfen wird, und die JVM beendet wird.
Heap ist aufgeteilt in verschiedene Abschnitte, genannt Generationen. Als Objekte überleben mehrere garbage collections auf, Sie werden gefördert in verschiedenen Generationen. Die älteren Generationen sind nicht Müll gesammelt, wie so oft. Da diese Objekte haben schon bewiesen, dass Sie mehr gelebt wird, sind Sie weniger wahrscheinlich, um eine garbage Collection ausgeführt werden.
Wenn die Objekte werden zuerst konstruiert, der Sie zugewiesen sind, in den Eden Space. Wenn Sie überleben, eine garbage collection, Sie werden gefördert, Survivor Space, und sollte Sie lange genug Leben gibt, die Sie zugeordnet sind, die Verbeamtet Generation. Diese generation ist Müll gesammelt, viel weniger Häufig.
Gibt es auch noch eine vierte generation, genannt die Permanente Generierung, oder PermGen. Die Objekte, die hier wohnen, sind nicht berechtigt, Müll gesammelt, und enthalten in der Regel eine unveränderliche Zustand notwendig für die JVM laufen, wie Klassendefinitionen und den String constant pool. Beachten Sie, dass der PermGen space ist geplant, die entfernt von Java 8, und wird ersetzt mit einem neuen Raum namens " Metaspace, die statt im systemeigenen Speicher.
Referenz:http://www.programcreek.com/2013/04/jvm-run-time-data-areas/
InformationsquelleAutor der Antwort Pythoner
Mit Java8, nicht-heap-region nicht mehr enthält PermGen aber Metaspace, das ist eine große Veränderung in Java8, angeblich, um loszuwerden, die out-of-memory-Fehler mit java als metaspace kann die Größe erhöht werden, je nach Platzbedarf durch die jvm für die Klasse Daten.
InformationsquelleAutor der Antwort user2767149
Java-Heap-Speicher ist Teil des Arbeitsspeichers für die JVM vom Betriebssystem.
Objekte befinden sich in einem Bereich, der sogenannten heap. Der heap wird erzeugt, wenn die JVM startet, und kann sich erhöhen oder verringern in der Größe, während die Anwendung ausgeführt wird. Wenn der heap voll ist, der Müll wird gesammelt.
Finden Sie mehr details über Eden Space, Survivor Space, Ordentlicher Raum und die Permanente Generierung unter SE Frage:
Junge , Verbeamtete und Perm generation
PermGen wurde ersetzt mit Metaspace seit Java 8 release.
Bezug auf Ihre Fragen:
Codecache: Die Java Virtual Machine (JVM) erzeugt native code und speichert ihn in einem Speicherbereich, den sogenannten codecache. Die JVM erzeugt nativen code für eine Vielzahl von Gründen, einschließlich der für die dynamisch generierten interpreter-Schleife, Java Native Interface (JNI) stubs, und für Java-Methoden, die in nativen code durch die just-in-time - (JIT -) compiler. Der JIT ist bei weitem der größte Nutzer der codecache.
InformationsquelleAutor der Antwort Ravindra babu