Heim  >  Artikel  >  Java  >  Analyse des Java-Speichermechanismus und des GC-Recyclingmechanismus (Bild- und Texteinführung)

Analyse des Java-Speichermechanismus und des GC-Recyclingmechanismus (Bild- und Texteinführung)

不言
不言nach vorne
2019-02-27 11:21:032915Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Analyse des Java-Speichermechanismus und des GC-Recyclingmechanismus (Bild- und Texteinführung). Ich hoffe, dass er für Sie hilfreich ist.

Der Prozess der Ausführung und Kompilierung von Java-Code

Analyse des Java-Speichermechanismus und des GC-Recyclingmechanismus (Bild- und Texteinführung)

Java-Speicherverwaltung

Java-Speichermodellaufteilung

Analyse des Java-Speichermechanismus und des GC-Recyclingmechanismus (Bild- und Texteinführung)

Zugriff auf die Positionierung von Objekten

Object obj = new Object();

Analyse des Java-Speichermechanismus und des GC-Recyclingmechanismus (Bild- und Texteinführung)

Erstellung und Initialisierung von Java-Objekten

Nachdem das Java-Objekt erstellt wurde, verfügt es über einen eigenen Bereich im Heap-Speicher, gefolgt vom Initialisierungsprozess des Objekts. Zusammenfassung der Initialisierungssequenz der Klassenmitglieder: zuerst statisch, dann normal, dann konstruieren, zuerst übergeordnete Klasse, dann untergeordnete Klasse und die Schreibreihenfolge auf derselben Ebene

  1. Führen Sie die übergeordnete Klasse aus Zuerst statische Variablen und statische Codeblöcke und dann statische Variablen und statische Codeblöcke der Unterklasse ausführen

  2. Führen Sie zuerst die gewöhnlichen Variablen und Codeblöcke der übergeordneten Klasse aus und führen Sie dann den Konstruktor der übergeordneten Klasse (statisch) aus Methode)

  3. Führen Sie zuerst die gewöhnlichen Variablen und Codeblöcke der Unterklasse aus und führen Sie dann den Unterklassenkonstruktor (statische Methode) aus

  4. Die Initialisierung der statischen Methode geht voraus Gewöhnliche Methoden und statische Initialisierung werden nur bei Bedarf durchgeführt und nur einmal initialisiert.

Hinweis: Für den Konstruktor der Unterklasse wird standardmäßig zunächst nach dem Konstruktor der übergeordneten Klasse ohne Parameter gesucht, unabhängig davon, ob der Konstruktor Parameter akzeptiert oder nicht. Wenn die übergeordnete Klasse keinen Konstruktor ohne Parameter hat, muss die Unterklasse den Supper-Schlüssel verwenden, um den Konstruktor der übergeordneten Klasse mit Parametern aufzurufen, andernfalls wird die Kompilierung nicht bestanden.

GC-Recyclingmechanismus

Der Garbage Collector in Java kann den von nutzlosen Objekten belegten Speicher automatisch zurückgewinnen, ist jedoch nur für die Freigabe des gesamten von erstellten Objekten belegten Speichers verantwortlich In Java kann der dem Objekt durch eine andere Methode als der Erstellung des Objekts zugewiesene Speicherplatz nicht vom Garbage Collector zurückgewonnen werden, und die Garbage Collection selbst hat auch einen Overhead, und die Priorität von GC ist relativ niedrig, sodass die JVM dies nicht tut Wenn der Speicher erschöpft ist, werden keine Ressourcen für die Speicherbereinigung verschwendet, um den Speicher wiederherzustellen. Schließlich werden wir feststellen, dass der vom Objekt belegte Speicherplatz niemals freigegeben wird, solange das Programm nicht fast keinen Speicherplatz mehr hat. Wir können einen Garbage Collector aktiv über den Code System.gc() starten (obwohl die JVM ihn nicht sofort wiederverwendet, bevor der durch new zugewiesene Speicherplatz freigegeben wird, wird der durch andere Methoden zugewiesene Speicherplatz durch finalize() freigegeben).

Welcher Speicher muss recycelt werden

Java-Heap, Methodenbereichsspeicher

Analyse des Java-Speichermechanismus und des GC-Recyclingmechanismus (Bild- und Texteinführung)

Wann recyceln?

  1. Referenzzählung

Fügt einem Objekt einen Referenzzähler hinzu, der darauf verweist. der Zähler plus eins. Andererseits wird der Zähler jedes Mal, wenn eine Referenz ungültig wird, um eins dekrementiert. Wenn der Zähler 0 ist, bedeutet dies, dass auf das Objekt nicht verwiesen wird. Zum Beispiel:
Analyse des Java-Speichermechanismus und des GC-Recyclingmechanismus (Bild- und Texteinführung)
Die Referenzzählmethode kann jedoch die Zirkelverweise zwischen Objekten nicht lösen, siehe folgendes Beispiel
Analyse des Java-Speichermechanismus und des GC-Recyclingmechanismus (Bild- und Texteinführung)
  1. Erreichbarkeitsanalyse

Erstellen Sie mehrere Stammobjekte (GC Root). Jedes Objekt ist ein untergeordneter Knoten. Wenn ein Objekt den Stammknoten nicht finden kann, gilt das Objekt als nicht erreichbar .
Analyse des Java-Speichermechanismus und des GC-Recyclingmechanismus (Bild- und Texteinführung)
Es gibt keinen Pfad vom Stammverzeichnis zu Objekt4 und Objekt5, was darauf hinweist, dass diese beiden Objekte vom Stammverzeichnis aus nicht erreichbar sind und recycelt werden können. In Java können folgende Objekte als GC-Roots verwendet werden: Objekte, auf die im Java Virtual Machine-Stack verwiesen wird; Objekte, auf die im Methodenbereich durch Konstanten verwiesen wird;

So recyceln Sie

  1. Markieren – Clearing-Algorithmus

Markieren Sie zunächst alle Objekte, die recycelt werden müssen. Nach Abschluss der Markierung werden alle markierten Objekte einheitlich recycelt.
Dieser Algorithmus weist zwei Probleme auf: 1) Der Markierungs- und Löschprozess ist nicht effizient. Hauptsächlich, weil der Garbage Collector alle erreichbaren Objekte vom GC Roots-Stammobjekt durchlaufen und diesen Objekten eine Markierung hinzufügen muss, um anzuzeigen, dass dieses Objekt während der Reinigungsphase übersprungen wird. Dann wird der Garbage Collector dies tun Der Heap wird von Anfang an durchlaufen zu beenden. Wenn ein Objekt nicht markiert ist, wird das Objekt gelöscht. Offensichtlich ist die Effizienz der Durchquerung sehr gering. 2) Es werden viele diskontinuierliche Raumfragmente generiert. Wenn also während der Ausführung des Programms ein größeres Objekt zugewiesen werden muss, kann es sein, dass es nicht genügend Speicher findet und dies tun muss Starten Sie im Voraus eine Müllabfuhr.
  1. Kopieralgorithmus

Teilt den Speicher in zwei Blöcke und verwendet jeweils nur einen Block. Wenn dieser Speicherblock voll ist, werden die verbleibenden Objekte in einen anderen Block kopiert und streng nach der Speicheradresse angeordnet. Anschließend wird der verwendete Speicherblock einheitlich recycelt.
Der Vorteil ist: Es kann kontinuierlicher Speicherplatz erhalten werden
Der Nachteil ist: Die Hälfte des Speichers wird verschwendet
Moderne JVM teilt den Speicherplatz nicht 1:1 auf, sondern teilt den Speicher in einen größeren auf Es werden jeweils der Eden-Bereich und zwei kleinere Survivor-Bereiche, Eden und ein Survivor-Bereich, genutzt. Kopieren Sie beim Recycling die überlebenden Objekte in Eden und Survivor sofort auf einen anderen Survivor und räumen Sie schließlich den Platz in Eden und Survivor auf. Tatsächlich stellt sich hier eine weitere Frage: Was passiert, wenn nach der Speicherbereinigung der von den überlebenden Objekten benötigte Platz größer ist als der verbleibende Platz des Survivor? Die Antwort ist, dass für die Zuweisung auf anderen Speicher zurückgegriffen werden muss (bezieht sich hier hauptsächlich auf die alte Generation).
  1. Mark-Organize-Algorithmus

Der Vorgang ist der gleiche wie beim Mark-Clear-Algorithmus, mit der Ausnahme, dass der nicht markierte Speicherbereich danach nicht bereinigt wird Die zweite besteht darin, alle überlebenden Objekte an ein Ende zu verschieben und dann den Speicher außerhalb der Grenze zu bereinigen
  1. Generierungsalgorithmus

Die sogenannte Generation Es unterteilt den Speicher entsprechend dem Lebenszyklus des Objekts in mehrere Blöcke, sodass der geeignete Garbage-Collection-Algorithmus entsprechend dem „Alter“ des Objekts ausgewählt werden kann. In Java werden Objekte im Speicher nach ihrer Lebensdauer unterteilt: 1. Neue Generation: kurzer Lebenszyklus, z. B. lokale Variablen 2. Alte Generation: Objekte mit langem Lebenszyklus 3. Permanente Generation: selten recycelt, langer Lebenszyklus; , wie zum Beispiel geladene Klasseninformationen.
Die neue und die alte Generation werden im Heap-Bereich gespeichert, und die permanente Generation wird im Methodenbereich gespeichert. Große Objekte werden direkt in die alte Generation eingegeben, z. B. sehr lange Zeichenfolgen oder große Arrays. Große Objekte sind eine schlechte Nachricht für die JVM-Speicherzuweisung, da große Objekte zusammenhängenden Speicher finden müssen, da sonst GC ausgelöst wird, ebenso wie kurzlebige große Objekte erforderlich Versuchen Sie es zu vermeiden. Objekte, die schon lange überlebt haben, werden in die alte Generation aufgenommen. Jedes Mal, wenn das Objekt in der neuen Generation einen kleineren GC durchläuft, wird sein Alter um 1 erhöht. Standardmäßig wird es in die alte Generation aufgenommen, wenn es 15 Jahre alt ist. Bei jedem Minor GC erkennt die virtuelle Maschine, ob die durchschnittliche Größe, die zur alten Generation heraufgestuft wird, größer ist als die aktuell verbleibende Größe der alten Generation. Wenn sie kleiner ist, wird ein vollständiger GC durchgeführt.
Die neue Generation verwendet einen Kopieralgorithmus (da es weniger überlebende Objekte und zu viele tote Objekte gibt). Wenn Sie den Mark-Sweep-Algorithmus verwenden, müssen Sie die Markierungen durchlaufen, was offensichtlich weniger effizient ist. Verwenden Sie jedoch die Kopie Der Algorithmus kann die überlebenden Objekte in den verfügbaren Speicherbereich kopieren, sodass die Effizienz beim GC-Recycling höher ist. Da die alte Generation eine hohe Überlebensrate aufweist, verwendet sie einen Markierungslösch- oder Markierungssortierungsalgorithmus für das Recycling.

Das obige ist der detaillierte Inhalt vonAnalyse des Java-Speichermechanismus und des GC-Recyclingmechanismus (Bild- und Texteinführung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen