2016-12-29 2 views
0

Ist nativer Speicher (Metaspace) für eine Java-Anwendung Speicherplatz aus Heap-Speicher oder gibt es eine andere Reihe von Speicher dafür gewidmet?Memory Management in Java - Metaspace/nativer Speicher

Ich denke, es verwendet den Speicher, der von OS verwendet wird, um alle ihre Anwendungen zu verwalten, aber nicht klar.

Antwort

0

Java Heap-Speicher

Java Heap-Speicher wird von Java Runtime verwendetem Speicher zu Objekten und JRE-Klassen zuzuordnen. Jedes Mal, wenn wir ein Objekt erstellen, wird es immer im Heap-Bereich erstellt. Die Speicherbereinigung wird auf dem Heapspeicher ausgeführt, um den Speicher für Objekte freizugeben, die keine Referenz enthalten. Jedes im Heap-Speicherbereich erstellte Objekt hat globalen Zugriff und kann von jedem Ort der Anwendung aus referenziert werden.

Java-Stack-Speicher

Java-Stack-Speicher für die Ausführung eines Threads verwendet. Sie enthalten methodenspezifische Werte, die von kurzer Dauer sind, und Verweise auf andere Objekte im Heap, die von der Methode abgerufen werden. Stapelspeicher wird immer in der Reihenfolge LIFO (Last-In-First-Out) referenziert. Wenn eine Methode aufgerufen wird, wird im Stapelspeicher ein neuer Block für die Methode erstellt, um lokale primitive Werte und Referenzen auf andere Objekte in der Methode zu speichern. Sobald die Methode endet, wird der Block unbenutzt und für die nächste Methode verfügbar. Die Stapelspeichergröße ist im Vergleich zum Heapspeicher sehr gering.

Unterschied zwischen Java Heap-Speicher und Stapelspeicher

  • Heap-Speicher durch alle Teile der Anwendung während Stapelspeicher wird nur von einem Ausführungs-Thread verwendet, verwendet wird.

  • Jedes Mal, wenn ein Objekt erstellt wird, wird es immer im Heap-Bereich gespeichert, und der Stapelspeicher enthält den Verweis darauf. Der Stapelspeicher enthält nur lokale primitive Variablen und Referenzvariablen für Objekte im Heap-Speicher.

  • Objekte, die im Heap gespeichert sind, sind global zugänglich, während andere Threads keinen Zugriff auf den Stapelspeicher haben.

  • Speicherverwaltung im Stapel erfolgt in LIFO-Manier, während es im Heap-Speicher komplexer ist, weil es global verwendet wird. Heap-Speicher ist unterteilt in Young-Generation, Old-Generation usw., mehr Details unter Java Garbage Collection.

  • Der Stapelspeicher ist kurzlebig, während der Heapspeicher vom Start bis zum Ende der Anwendungsausführung lebt.

  • Wir können die Option -Xms und -Xmx JVM verwenden, um die Startgröße und die maximale Größe des Heapspeichers zu definieren. Wir können -Xss verwenden, um die Stapelspeichergröße zu definieren.

  • Wenn der Stapelspeicher voll ist, löst die Java-Laufzeitumgebung java.lang.StackOverFlowError aus. Wenn der Heap-Speicher voll ist, wird java.lang.OutOfMemoryError: Java Heap Space ausgegeben.

  • Die Größe des Stack-Speichers ist im Vergleich zum Heap-Speicher sehr gering. Aufgrund der Einfachheit der Speicherzuweisung (LIFO) ist der Stapelspeicher im Vergleich zum Heap-Speicher sehr schnell.

Referenz:

Dies ist die grundlegende Java Memory Management, sondern durch das Referenzmaterial gehen sollten Sie umfassende Idee geben.

bearbeiten

Dank Hinweis darauf, zu diesem großen Artikel über how the JVM uses native memory on Windows and Linux @rajvineet. Speziell der Abschnitt, how the Java runtime uses native memory beschreibt alles klar.

+0

Um genau zu sein, meine Frage ist dieser Stapelspeicher/nativememory (Speicher von Klasse Loader-Elemente verwendet) verwenden Sie einen Teil des Heap-Speichers oder nicht. – rajvineet

+0

Danke für Ihre Antwort. Aber um genau zu sein, meine Frage ist, dass dieser Stapelspeicher/nativer Speicher (Speicher, der von Klassenladerelementen verwendet wird) einen Teil des Heapspeichers verwendet oder nicht. Angenommen, Sie haben Ihrer Java-Anwendung 3 GB Heap-Speicher zugewiesen. Also, welche native Speicher von Java-Anwendung konsumiert wird der Teil dieser 3 GB Speicher nicht sein? – rajvineet

+0

Bekam einen nützlichen Link, der all diese Speicherverwaltung in Java erklärt: - – rajvineet