Heim  >  Artikel  >  Java  >  JVM-Speicherverwaltung ------ Übersicht über die Speicherverwaltung der JAVA-Sprache

JVM-Speicherverwaltung ------ Übersicht über die Speicherverwaltung der JAVA-Sprache

黄舟
黄舟Original
2016-12-28 15:26:131243Durchsuche

Einführung

Speicherverwaltung war schon immer der Stolz der JAVA-Sprache. Sie ermöglicht es JAVA-Programmierern, die Details im Zusammenhang mit der Speicherverwaltung im Grunde völlig zu ignorieren und sich nur auf die Geschäftslogik zu konzentrieren. Allerdings ist nichts Gutes auf der Welt perfekt, es bringt aber auch viele verrückte Speicherüberlauf- und Leckprobleme mit sich.
Das Beängstigende ist nicht nur, dass einige Programmierer, die in anderen Sprachen entwickeln, JAVA-Programmierer als „speicherignorant“ bezeichnen, was wirklich inakzeptabel ist. Schließlich gibt es in JAVA kein Malloc und Löschen, keine Destruktoren und keine Zeiger. Wie können Programmierer, die neu in JAVA sind, mit dem Speicherteil in Kontakt kommen? Darüber hinaus gibt es viele befreundete JAVA-Programmierer, die ihr Hauptfach abbrechen und wurden auf halbem Weg Mönche.
Obwohl es schwierig ist, dies zu akzeptieren, gibt es in der Tat viele JAVA-Programmierer, die nichts über das Gedächtnis wissen. Obwohl die Beherrschung der relevanten Kenntnisse des Gedächtnisses möglicherweise keine weltbewegenden Veränderungen und Vorteile für die tägliche Entwicklung mit sich bringt, wird es dennoch so sein Verbessern Sie Ihr technisches Niveau auf subtile Weise, nachdem Sie die Speicherverwaltung verstanden haben. Ich glaube, dass Sie ein tiefes Verständnis dafür haben werden.

Speicheraufteilung

Wenn es um den Speicher geht, handelt es sich um einen Datenspeicherbereich, der nur dann vorhanden ist, wenn das Programm ausgeführt wird. Was die Aufteilung dieses Bereichs betrifft, hat jede virtuelle Maschine ihre eigene eigene Divisionsmethode, sie müssen jedoch den grundlegenden Spezifikationen der JAVA Virtual Machine entsprechen, um implementiert zu werden.
In der Spezifikation der virtuellen Maschine ist der Speicher in sechs Teile unterteilt, nämlich PC-Register, JAVA-Virtual-Machine-Stapel, JAVA-Heap, Methodenbereich, Laufzeitkonstantenpool und lokaler Methodenstapel.

JAVA Virtual Machine Specification und JAVA Virtual Machine

Hier müssen wir auch den Unterschied zwischen der JAVA Virtual Machine Specification und der JAVA Virtual Machine Specification erklären ist eine Implementierung der virtuellen JAVA-Maschine. Die Spezifikationsanforderungen werden von Oracle formuliert, und die virtuelle JAVA-Maschine, auf die wir uns normalerweise beziehen, bezieht sich im Allgemeinen auf die Implementierung einer bestimmten virtuellen JAVA-Maschinenspezifikation. Beispielsweise gibt es den am häufigsten verwendeten Hotspot für JAVA-Virtual-Machine. Tatsächlich gibt es viele Implementierungen der JAVA-Virtual-Machine-Spezifikation. Selbst wenn Sie ein tiefes Verständnis der JAVA-Virtual-Machine-Spezifikation haben und daran interessiert sind, können Sie Ihre eigene schreiben Natürlich ist die Schwierigkeit nicht schwer vorstellbar.

Strukturdiagramm

Das folgende Bild ist ein JVM-Strukturdiagramm aus der Baidu-Bibliothek. Da der Laufzeitkonstantenpool ein vom Methodenbereich zugewiesener Bereich ist, gibt es in diesem Bild keine Laufzeitkonstante. Messbecken.

JVM-Speicherverwaltung ------ Übersicht über die Speicherverwaltung der JAVA-Sprache

Detaillierte Erläuterung des Speicherbereichs

Im Bild oben bezieht sich der Speicher auf den Laufzeitdatenbereich im rechteckigen Feld. Hier finden Sie eine kurze Einführung in die Funktionen der einzelnen Teile:
1. PC-Register (Thread Unique): Der vollständige Name ist das Programmzählerregister, das die Adresse der aktuell von jedem Thread ausgeführten JAVA-Methode aufzeichnet. Wenn derzeit eine lokale Methode ausgeführt wird, ist der Programmzähler eine leere Adresse. Seine Funktion besteht darin, Multithreading und eine Reihe von Vorgängen wie Thread-Blockierung, Wiederherstellung und Suspendierung zu unterstützen. Stellen Sie sich intuitiv vor, wie Sie eine Wiederherstellung durchführen können, wenn Sie sich nicht an die aktuelle Ausführungsposition jedes Threads erinnern. Auf dieser Grundlage verfügt jeder Thread über ein PC-Register, was bedeutet, dass das PC-Register für den Thread eindeutig ist.
2. JAVA-Virtual-Machine-Stapel (einzigartig für Threads): Der JAVA-Virtual-Machine-Stapel wird beim Erstellen eines Threads erstellt und zum Speichern von Stapelrahmen verwendet. Der JAVA-Virtual-Machine-Stapel ist auch für Threads einzigartig.


Stapelrahmen: Einfach ausgedrückt kann er als Speicherbereich für temporäre Daten interpretiert werden, wenn eine Methode ausgeführt wird. Konkret umfasst er gleichzeitig Daten und einen Teil der Prozessergebnisse ist außerdem für die Verarbeitung von Methodenrückgabewerten, die dynamische Verknüpfung und das Versenden von Ausnahmen verantwortlich. Der Stapelrahmen wird erstellt, wenn die Methode erstellt wird, und zerstört, wenn die Methode endet. Wenn die Methode eine Ausnahme auslöst, wird dies auch als Ende der Methode betrachtet. Allerdings gibt es in jedem Stapelrahmen eine eigene lokale Variablentabelle und einen eigenen Operandenstapel sowie einen Verweis auf den Laufzeitkonstantenpool der aktuellen Klasse.
Lokale Variablentabelle: Es handelt sich um eine Liste lokaler Methodenvariablen, die während der Kompilierung in die Klassendatei geschrieben wird. Für ein einfaches Verständnis kann es als Objektarray verstanden werden, das jeder lokalen Variablen entsprechend dem Index 0 bis Länge 1 entspricht. Insbesondere wenn es sich um die lokale Variablentabelle der Instanzmethode handelt, wird die 0. lokale Variable verwendet be Ein Verweis auf die aktuelle Instanz, bei der es sich um das Schlüsselwort this handelt, und die restlichen lokalen Variablen beginnen bei Index 1.
Operandenstapel: Es handelt sich um einen LIFO-Stack (Last-In-First-Out), dessen Länge beim Kompilieren auch in die Klassendatei geschrieben und festgelegt wird. Seine Funktion besteht darin, Platz für die Berechnung der Bytecode-Befehlsoperationsvariablen bereitzustellen. Für den Satz int a=9 müssen Sie beispielsweise zuerst 9 in den Operandenstapel schieben und dann 9 der Variablen a zuweisen.

3. JAVA-Heap (global geteilt): Dieser Teil ist der wichtigste Teil des JAVA-Speichers. Der Grund, warum er der wichtigste Teil ist, liegt nicht an seiner Wichtigkeit, sondern daran, dass er der wichtigste Teil ist ein Entwicklerteil, dem Aufmerksamkeit geschenkt werden sollte. Es wird beim Start der virtuellen JAVA-Maschine erstellt, speichert alle Objektinstanzen und Array-Objekte und verfügt über ein integriertes „automatisches Speicherverwaltungssystem“, das wir oft als Garbage Collector (GC) bezeichnen. Die Speicherfreigabe im JAVA-Heap wird nicht vom Entwickler kontrolliert und wird vollständig von der virtuellen JAVA-Maschine verwaltet. Die Spezifikation für virtuelle JAVA-Maschinen enthält keine klaren Vorschriften für die Implementierung eines Garbage Collectors in einer virtuellen JAVA-Maschine. Aus diesem Grund werden in der von uns verwendeten virtuellen JAVA-Maschine viele Arten von Garbage Collectors bereitgestellt . Erfüllen Sie verschiedene Leistungsanforderungen.
4. Methodenbereich (globale gemeinsame Nutzung): Der Methodenbereich ist auch eine Komponente des Heaps. Er speichert hauptsächlich den Laufzeitkonstantenpool, Feldinformationen, Methodeninformationen, den Bytecode-Inhalt von Konstruktoren und gewöhnlichen Funktionen sowie einige spezielle Funktionen Verfahren. Der größte Unterschied zum JAVA-Heap besteht darin, dass sich die gespeicherten Informationen vom JAVA-Heap unterscheiden. Der größte Unterschied besteht darin, dass dieser Teil der JAVA-Spezifikation für virtuelle Maschinen nicht die Implementierung eines automatischen Speicherverwaltungssystems (GC) vorschreibt.
5. Nativer Methodenstapel (einzigartig für Threads): Der lokale Methodenstapel ist ein traditioneller Stapel, der zur Unterstützung der Ausführung nativer Methoden verwendet wird. Wenn die virtuelle JAVA-Maschine andere Sprachen zur Implementierung des Befehlssatzinterpreters verwendet, wird auch der native Methodenstapel verwendet. Wenn keiner der beiden vorherigen Fälle auftritt, das heißt, wenn die virtuelle JAVA-Maschine nicht auf den nativen Methodenstapel angewiesen ist und die virtuelle JAVA-Maschine keine nativen Methoden unterstützt, wird der native Methodenstapel nicht benötigt. Bei Bedarf wird beim Start jedes Threads auch der lokale Methodenstack erstellt.
Mit Ausnahme des PC-Registers erfordern die anderen vier oben genannten Speicherbereiche im Allgemeinen die Implementierung einer virtuellen JAVA-Maschine, um Kunden Größenanpassungsparameter bereitzustellen, bei denen es sich um unsere häufig verwendeten Xms, Xmx usw. handelt.

Speicherverwaltung

Die Speicherverwaltung ist in Speicherzuweisung und Speicherfreigabe unterteilt. Schauen Sie sich die fünf Speicherbereiche oben an. Tatsächlich kann sie grob in zwei Teile unterteilt werden, einer davon ist global geteilt und der andere ist threadunabhängig.
Dieser für den Thread einzigartige Teil des Speichers wird erstellt, wenn der Thread gestartet wird, und wenn der Thread zerstört wird, wird der Speicher freigegeben. Dieser Teil des Speichers muss nicht vom Garbage Collector verwaltet werden, sondern wird von der virtuellen JAVA-Maschine aktiv verwaltet. Immer wenn ein Thread erstellt wird, weist die virtuelle JAVA-Maschine ihm das entsprechende PC-Register und den virtuellen JAVA-Maschinenstapel zu notwendig Wenn ja, wird es auch einen lokalen Methodenstapel geben. Wenn ein Thread zerstört wird, gibt die virtuelle JAVA-Maschine entsprechend auch den gesamten von diesem Thread belegten Speicher frei.
Verglichen mit dem Teil des Speichers, der nur für Threads gilt, ist der Teil des global gemeinsam genutzten Speichers schwieriger zu handhaben. Dies gilt jedoch nur für die Implementierung virtueller Maschinen, da dieser Teil des Speichers für die Implementierung des automatischen Speicherverwaltungssystems erforderlich ist (GC) .
Die Speicherzuweisung für diesen Teil des global gemeinsam genutzten Speichers (im Folgenden als Heap bezeichnet) wird hauptsächlich durch die explizite Verwendung des neuen Schlüsselworts durch den Programmierer ausgelöst. Wo und wie dieser Teil des neuen Speichers zugewiesen wird, wird von der JAVA-Virtual festgelegt Maschine. Die Freigabe dieses Teils des Speichers wird vom automatischen Speicherverwaltungssystem (im Folgenden als GC bezeichnet) verwaltet.
Normalerweise hängt die Heap-Speicherzuweisung von der GC-Strategie und -Implementierung ab. Bei der Zuweisung müssen Sie überlegen, wie Sie diesen Teil des Speichers zurückgewinnen. Aus diesem Grund müssen wir zur Erklärung der Speicherzuweisung zunächst verstehen, wie Speicher recycelt wird, um besser zu verstehen, wie Speicher zugewiesen wird.

Fazit

Das Obige ist der Inhalt der JVM-Speicherverwaltung ------ Übersicht über die Speicherverwaltung in der JAVA-Sprache. Weitere verwandte Inhalte finden Sie unter PHP chinesische Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn