Langweiliges JavaEE vom Eintrag bis zur Aufgabe (vier) Garbage Collection-Mechanismus (Garbage Collection)

Inhaltsverzeichnis

1. Das Prinzip und der Algorithmus der Speicherbereinigung

1. Speicherverwaltung

2. Speicherbereinigungsprozess

3. Garbage Collection-bezogene Algorithmen

2. Universeller Speicherbereinigungsmechanismus für Generationen

1. Die junge Generation

2. Ältere Generation

3. Ständige Generation

4. Drei GCs

3. JVM-Tuning und Full GC

Viertens. Andere Punkte

Fünftens: Vorgänge, die wahrscheinlich zu Speicherverlusten in der Entwicklung führen. Zusammenfassung des Wissens über die Speicherbereinigung

1. Erstellen Sie viele nutzlose Objekte

2. Die Verwendung statischer Sammlungen

3. Verschiedene Verbindungsobjekte (I0-Stream-Objekt, Datenbankverbindungsobjekt, Netzwerkverbindungsobjekt) werden nicht geschlossen

4. Verwendung des Listeners


Java führte einen Garbage Collection-Mechanismus ein, der das problematischste Speicherverwaltungsproblem von C ++ - Programmen löste. Java-Programmierer können mehr Energie in die Geschäftslogik stecken als in die Speicherverwaltung, was die Entwicklungseffizienz erheblich verbessert.

1. Der Speicherbereinigungsprozess ist im Allgemeinen in zwei Schritte unterteilt. Welche zwei Schritte sind das?

Antwort: (1) Wie finde ich Müll? (2) Recycling
2. Was sind die beiden gängigen Algorithmen für die Müllabfuhr?

Antwort: Referenzzählmethode, erreichbare Referenzmethode (Wurzelsuchalgorithmus)
3. Der Heapspeicher ist unterteilt in: junge Generation, alte Generation, permanente Generation. Der Garbage Collector ist unterteilt in: Minor GC, Major GC, FulIGC. Welchen Bereichen entsprechen diese drei Garbage Collectors?

Antwort: Minor GC entspricht der jungen Generation, Major GC entspricht der alten Generation und FulIGC entspricht allen.
4. Bei der Optimierung der JVM besteht ein großer Teil der Arbeit in der Anpassung der vollständigen GC. Ist dieser Satz richtig?

Antworten.
5. Welche Rolle spielt System.gc ()?

Antwort: Es wird empfohlen, den Garbage Collection-Thread zu starten.

 

1. Das Prinzip und der Algorithmus der Speicherbereinigung

1. Speicherverwaltung

Die Speicherverwaltung von Java bezieht sich in hohem Maße auf die Verwaltung von Objekten im Heap , einschließlich der Zuweisung und Freigabe von Objektbereich.
Die Zuweisung des Objektbereichs: Verwenden Sie das neue Schlüsselwort, um ein Objekt zu erstellen.
Freigabe des Objektraums: Weisen Sie das Objekt null zu. Der Garbage Collector ist dafür verantwortlich, den Speicherplatz aller "nicht erreichbaren" Objekte zurückzugewinnen.

2. Speicherbereinigungsprozess

Jede Art von Speicherbereinigungsalgorithmus muss im Allgemeinen zwei grundlegende Dinge tun:
1. Nutzlose Objekte finden
2. Den von nutzlosen Objekten belegten Speicherplatz zurückfordern.

Der Speicherbereinigungsmechanismus garantiert, dass "nutzlose Objekte" recycelt werden können. Ein nutzloses Objekt bedeutet, dass sich keine Variable auf das Objekt bezieht. Der Garbage Collector von Java findet nutzlose Objekte mithilfe verwandter Algorithmen, bereinigt sie und organisiert sie.

3. Garbage Collection-bezogene Algorithmen

1.
Jedes Objekt im Heap der Referenzzählmethode entspricht einem Referenzzähler. Wenn eine Referenz auf dieses Objekt vorhanden ist, wird der Referenzzähler um 1 erhöht, und wenn die Referenz auf das Objekt ungültig wird (die Referenz wird null), wird die Der Referenzzähler wird um 1 verringert. Wenn der Wert des Referenzrechners des Objekts 0 ist, betrachtet der Java-Garbage Collector das Objekt als nutzloses Objekt und recycelt es. Der Vorteil ist, dass der Algorithmus einfach ist, aber der Nachteil ist, dass "zirkular referenzierte nutzlose Objekte" nicht identifiziert werden können.

2. Das
Programm der Referenzerreichbarkeitsmethode (Wurzelsuchalgorithmus) behandelt alle Referenzbeziehungen als Diagramm, beginnend mit einem Knoten GC ROOT, sucht nach dem entsprechenden Referenzknoten, und sucht nach dem Finden dieses Knotens weiter nach dem Referenzknoten dieses Knotens. Wenn Nachdem alle referenzierten Knoten durchsucht wurden, werden die verbleibenden Knoten als nicht referenzierte Knoten betrachtet, dh als nutzlose Knoten.

2. Universeller Speicherbereinigungsmechanismus für Generationen

Der generelle Garbage Collection-Mechanismus basiert auf der Tatsache, dass der Lebenszyklus verschiedener Objekte unterschiedlich ist. Daher können
Objekte mit unterschiedlichen Lebenszyklen unterschiedliche Recyclingalgorithmen anwenden, um die Recyclingeffizienz zu verbessern. Wir teilen Objekte in drei Zustände ein: junge Generation, alte Generation und permanente Generation. Versetzen Sie gleichzeitig Objekte in verschiedenen Zuständen in verschiedenen Bereichen des Heaps.
JVM unterteilt den Heapspeicher in Eden, Survivor und Tenured / Old Space. (Eden, Survivor gehören zur jungen Generation, Tenured / Old gehören zur alten Generation)

1. Die junge Generation

Alle neu generierten Objekte werden zuerst im Eden-Bereich platziert. Das Ziel der jungen Generation ist es, diese Objekte mit einem kurzen Lebenszyklus so schnell wie möglich zu sammeln. Dies entspricht Minor GC. Jedes Mal, wenn Minor GC den Speicher der jungen Generation bereinigt, verwendet der Algorithmus einen effizienteren Kopieralgorithmus und häufige Operationen, aber es wird Speicherplatz verschwenden. Wenn der Bereich "junge Generation" voller Objekte ist, werden die Objekte im Bereich der alten Generation gespeichert.

2. Ältere Generation

Objekte, die N (Standard 15) Speicherbereinigungen in der jungen Generation überleben, werden in der alten Generation platziert. Daher kann davon ausgegangen werden, dass die in der alten Generation gespeicherten Objekte langlebige Objekte sind. Es gibt immer mehr Objekte der alten Generation. Wir müssen Major GC und Full GC (vollständige Wiederherstellung) starten, um den Bereich der jungen Generation und den Bereich der alten Generation umfassend zu bereinigen.

3. Ständige Generation

Wird zum Speichern statischer Dateien wie Java-Klassen, Methoden usw. verwendet. Die persistente Generierung hat keinen signifikanten Einfluss auf die Speicherbereinigung. JDK7 war früher eine Implementierung von "Methodenbereich". Nach JDK8 gibt es keine "permanente Generierung". Verwenden Sie stattdessen den Metaspace-Metadatenbereich und den Heap.

4. Drei GCs

Minor GC:
Wird verwendet, um den Bereich der jungen Generation aufzuräumen. Wenn der Eden-Bereich voll ist, wird ein Minor GC ausgelöst. Bereinigen Sie nutzlose Objekte und kopieren Sie nützliche Objekte in die Bereiche "Survivor1" und "Survivor2".
Major GC:
Wird verwendet, um den Bereich der alten Generation aufzuräumen.
Full GC:
Wird verwendet, um die jungen und alten Regionen aufzuräumen. Die Kosten sind hoch, was sich auf die Systemleistung auswirkt.

3. JVM-Tuning und Full GC

Bei der Optimierung der JVM besteht ein großer Teil der Arbeit in der Anpassung der vollständigen GC. Eine vollständige GC kann aus folgenden Gründen verursacht werden:
1. Die dauerhafte Erzeugung ist voll

2. Perm (Perm) ist voll

3. System.gc () wird explizit aufgerufen

4. Dynamische Änderungen in der Domänenzuweisungsstrategie von Heap nach dem letzten GC

Viertens. Andere Punkte

1. Der Programmierer hat kein Recht, den Garbage Collector aufzurufen.
2. Der Programmierer kann System.gc () aufrufen. Diese Methode dient nur dazu, die JVM zu benachrichtigen, nicht den Garbage Collector auszuführen. Versuchen Sie, es so wenig wie möglich zu verwenden. Sie werden versuchen, Full GC zu starten, was kostspielig ist und die Systemleistung beeinträchtigt.
3. Die Finalize-Methode ist eine Methode, die Java Programmierern zur Verfügung stellt, um Objekte oder Ressourcen freizugeben, diese jedoch so wenig wie möglich zu verwenden.

Fünftens: Vorgänge, die wahrscheinlich zu Speicherverlusten in der Entwicklung führen. Zusammenfassung des Wissens über die Speicherbereinigung

In der tatsächlichen Entwicklung stürzt das System häufig ab. Wir sollten diese Verwendungsszenarien für die folgenden Vorgänge berücksichtigen.

Die Szenarien, die in den folgenden vier Situationen am wahrscheinlichsten zu Speicherlecks führen:

1. Erstellen Sie viele nutzlose Objekte

Wenn wir beispielsweise eine große Anzahl verketteter Zeichenfolgen benötigen, verwenden wir String anstelle von StringBuilder.

z.B:

String str= "";
for (inti= 0;i < 10000; i++) {

    str += i;//相当于产生了10000个String对象
}

2. Die Verwendung statischer Sammlungen

Die Verwendung von HashMap, Vektor, Liste usw. ist am anfälligsten für Speicherverluste. Der Lebenszyklus dieser statischen Variablen stimmt mit der Anwendung überein, und alle Objekte können nicht freigegeben werden.

3. Verschiedene Verbindungsobjekte (I0-Stream-Objekt, Datenbankverbindungsobjekt, Netzwerkverbindungsobjekt) werden nicht geschlossen

Verbindungsobjekte wie E / A-Stream-Objekte, Datenbankverbindungsobjekte und Netzwerkverbindungsobjekte sind physische Verbindungen und mit der Festplatte oder dem Netzwerk verbunden. Sie müssen geschlossen werden, wenn sie nicht verwendet werden.

4. Verwendung des Listeners

Beim Loslassen des Objekts wurde der entsprechende Listener nicht gelöscht

 

 

 

 

 

 

 

 

 

 

Ich denke du magst

Origin blog.csdn.net/weixin_44593822/article/details/115309941
Empfohlen
Rangfolge