Wie wir im vorherigen Artikel erwähnt haben, besteht die automatische Speicherverwaltung aus zwei Teilen: dem Zuweisen von Speicher zu Objekten und dem Zurückgewinnen des den Objekten zugewiesenen Speichers. In diesem Artikel sprechen wir über Letzteres, nämlich das Recycling des dem Objekt zugewiesenen Speichers. Das Recycling von Speicher erfordert die Verwendung eines Garbage-Collection-Mechanismus, dessen englischer Name GC (Garbage Collection) ist.
In diesem Teil müssen wir die folgenden Fragen lösen:
1. Welcher Speicher muss recycelt werden?
2. Wann wird es recycelt?
3. Wie recyceln?
Welcher Speicher muss recycelt werden?
Der Speicher im Heap- und Methodenbereich muss recycelt werden, der Rest muss nicht recycelt werden.
Da nur der Heap- und Methodenbereich von Threads gemeinsam genutzt wird und der Rest mit dem Thread „lebt und stirbt“, wird der Speicher natürlich recycelt, also machen Sie sich keine Sorgen.
Wann wird es recycelt?
(1) Im Haufen:
Wenn das Objekt „stirbt“, muss es recycelt werden. Was bedeutet es, dass das Objekt tot ist? Es gibt einfach keinen Ort, an dem man darauf verweisen kann, es ist nutzlos. Wie erkennt man also, ob es tot ist?
Es gibt zwei Methoden:
Referenzzählalgorithmus
Immer wenn es eine Stelle gibt, die darauf verweist Der Wert des Zählers ist +1. Wenn die Referenz fehlschlägt, ist der Wert des Zählers -1. Wenn der Wert des Zählers 0 ist, bedeutet dies, dass das Objekt nicht mehr referenziert wird, dh „es kann sterben“.
Aber das hat einen Nachteil, nämlich das Problem der Zirkelverweise. Genau wie im Bild unten können die beiden Objekte im Heap auch dann nicht recycelt werden, wenn sie unbrauchbar sind, da sie aufeinander verweisen und der Zählerwert mindestens 1 ist.
Erreichbarkeitsanalyse
Alle generierten Objekte sind Teilbäume einer Wurzel namens „GC Roots“. Ausgehend von den GC-Wurzeln und der Suche nach unten wird der von der Suche zurückgelegte Pfad als Referenzkette bezeichnet. Wenn ein Objekt keine Referenzkette hat, um die GC-Wurzeln zu erreichen, wird das Objekt als nicht erreichbar bezeichnet, das heißt, es kann vom GC recycelt werden. Dies ist eine häufig verwendete Methode in Java.
Genau wie die nicht referenzierten Objekte im Haufen im Bild unten können sie recycelt werden.
Wie kann festgestellt werden, ob ein Objekt noch eine Referenz hat? In Java gibt es vier Arten von Referenzen:
Starke Referenz: Object o=new Object() Solange die starke Referenz vorhanden ist, wird der GC das referenzierte Objekt niemals zurückfordern.
Soft-Referenz: Beschreibt einige Objekte, die nützlich, aber nicht notwendig sind. Wenn das System kurz vor einem Speicherüberlauf steht, wird dieser recycelt.
Schwacher Hinweis: Solange GC durchgeführt wird, wird es recycelt.
Virtuelle Referenz: Dies ist die schwächste Referenzbeziehung. Eine Objektinstanz kann nicht über eine virtuelle Referenz abgerufen werden. Seine Funktion besteht darin, eine Systembenachrichtigung zu erhalten, wenn dieses Objekt vom Collector recycelt wird.
(2) Im Methodenbereich:
Wir wissen, dass das, was im Methodenbereich gespeichert ist, von geladen wurde Klasseninformationen der virtuellen Maschine, Konstanten, statische Variablen, vom Just-in-Time-Compiler kompilierter Code und andere Daten. Deshalb führen wir eine Speicherbereinigung im Methodenbereich durch und recyceln einige verlassene Konstanten und nutzlose Klassen.
Wie kann man feststellen, ob eine Konstante veraltet ist?
Sehen Sie sich einfach die Referenzanzahl an. Wenn kein Objekt auf die Konstante verweist, bedeutet dies, dass die Konstante aufgegeben wurde und recycelt werden kann.
Wie kann man feststellen, ob eine Klasse nutzlos ist?
Es gibt drei Situationen:
Alle Instanzen dieser Klasse wurden recycelt.
b. Der ClassLoader, der diese Klasse geladen hat, wurde recycelt.
c. Auf das dieser Klasse entsprechende java.lang.Class-Objekt wird nirgendwo verwiesen, und auf die Methoden dieser Klasse kann nirgendwo durch Reflektion zugegriffen werden.
Wie recycelt man?
Es gibt 4 Algorithmen als Theorien:
• Mark-Sweep-Algorithmus
• Kopieralgorithmus
• Mark-Collation-Algorithmus
• Generational Collection-Algorithmus
Es gibt 5 Arten von Sammlern als Implementierungen:
Postscript
Speicherüberlauf: Das System kann nicht zuordnen mehr Nehmen Sie sich den Platz heraus, den Sie brauchen. Beispielsweise kann neuen Objekten im Heap kein Speicher mehr zugewiesen werden, und wenn der Stapel voll ist, können keine neuen Stapelrahmen auf den Stapel geschoben werden.
Speicherleck: Wenn der Speicher von einem Objekt belegt ist und nicht zurückgegeben wird, spricht man von einem Speicherleck.
Das Obige ist eine detaillierte Erklärung des Garbage-Collection-Mechanismus in JVM. Weitere verwandte Fragen finden Sie auf der chinesischen PHP-Website: JAVA-Video-Tutorial
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in JAVA Virtual Machine (JVM) (3) – Garbage-Collection-Mechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!