Heim  >  Artikel  >  Java  >  Java erklärt die Speicherbereinigung und den Objektlebenszyklus ausführlich

Java erklärt die Speicherbereinigung und den Objektlebenszyklus ausführlich

高洛峰
高洛峰Original
2017-01-17 15:50:541501Durchsuche

Detaillierte Erklärung der Java-Garbage-Collection und des Objektlebenszyklus

Garbage-Collection und des Objektlebenszyklus in Java

1. Garbage-Collection

Garbage-Collection ist der Speicher in Java Programmierung Das Kernkonzept der Verwaltung, der Speicherverwaltungsmechanismus der JVM, wird als Garbage Collection-Mechanismus bezeichnet.

Nachdem ein Objekt erstellt wurde, wird es im Heap-Speicher der JVM abgelegt. Wenn auf dieses Objekt nicht mehr verwiesen wird, wird es von der JVM im Heap-Speicher recycelt. Erstellte Objekte können nicht reproduziert werden und es gibt keine Möglichkeit, sie über Programmanweisungen freizugeben. Das heißt, wenn ein Objekt nicht über die Stammsammlung im JVM-Laufzeitbereich erreicht (gefunden) werden kann, wird das Objekt als Müllobjekt bezeichnet. Die Stammsammlung besteht aus statischen Referenzfeldern und lokalen Referenzfeldern in der Klasse. Die JVM indiziert Objekte über die Stammsammlung.

Bei der Entwicklung von Java-Anwendungen werden häufig zwei von der JVM verwaltete Speichertypen verwendet: Heap-Speicher und Stapelspeicher. Einfach ausgedrückt wird der Heap-Speicher hauptsächlich zum Speichern von Objekten und Variablen verwendet, die vom Programm zur Laufzeit erstellt oder instanziiert werden. Zum Beispiel Objekte, die mit dem neuen Schlüsselwort erstellt wurden. Der Stapelspeicher wird zum Speichern von Methoden verwendet, die im Programmcode als statisch oder nicht statisch deklariert sind.

(1) Heap-Speicher

Im Heap-Speicher gespeicherte Objekte können von der JVM automatisch recycelt werden und können nicht auf andere Weise recycelt werden Das heißt, Entwickler können keine Objekte im Heap-Speicher zurückgewinnen, indem sie relevanten Code hinzufügen. Der Heap-Speicher ist normalerweise in zwei Bereiche unterteilt: den Bereich für neue Objekte und den Bereich für alte Objekte.

Neuer Objektbereich: Er kann in drei kleine Bereiche unterteilt werden: Eden-Bereich, Von-Bereich und Bis-Bereich. Der Eden-Bereich wird zum Speichern neu erstellter Objekte verwendet. Es ist wie ein Stapel. Neue Objekte werden erstellt, wenn die Objekte im Eden-Bereich voll sind Die Aufgabe des Sex-Tests besteht darin, zu erkennen, welche Objekte aus der Stammsammlung nicht erreichbar sind. Diese Objekte können von der JVM recycelt werden, und alle aktiven Objekte werden aus dem Eden-Bereich in den To-Bereich kopiert Einige Objekte werden vom Bereich „An“ in den Bereich „Von“ übertragen. Der gesamte Prozess der oben genannten Objektmigration wird von der JVM gesteuert.

Alter Objektbereich: Objekte im alten Objektbereich haben immer noch einen langen Lebenszyklus. Die meisten Müllobjekte des JVM-Systems stammen aus „kurzlebigen“ Objekten Alte Objektbereiche werden zu Müllobjekten. Zu diesem Zeitpunkt sind sie alle entsprechend markiert und das JVM-System recycelt diese Müllobjekte automatisch. Es wird empfohlen, das System nicht zu einer häufigen Müllsammlung zu zwingen. Dies liegt daran, dass die JVM nur begrenzte Systemressourcen für die Müllsammlung benötigt Erstens führt dies dazu, dass die Anwendung nicht schnell auf Benutzeranfragen reagieren kann, was sich auf die Gesamtleistung des Systems auswirkt.

(2) Stapelspeicher

Heapspeicher wird hauptsächlich zum Speichern von Objekten und Variablen verwendet, die vom Programm während der Laufzeit erstellt oder instanziiert werden. Zum Beispiel Objekte, die mit dem neuen Schlüsselwort erstellt wurden. Der Stapelspeicher wird zum Speichern von Methoden verwendet, die im Programmcode als statisch oder nicht statisch deklariert sind.

2. Lebenszyklus von Objekten in JVM

Im JVM-Laufzeitbereich kann der gesamte Lebenszyklus eines Objekts grob in 7 Phasen unterteilt werden:

Erstellungsphase;

unsichtbare Phase;

letzte Phase; >

Release-Phase

Die oben genannten 7 Phasen bilden den vollständigen Lebenszyklus von Objekten in der JVM.

(1) Erstellungsphase

In der Objekterstellungsphase schließt das System den Objekterstellungsprozess hauptsächlich durch die folgenden Schritte ab:

f35d6e602fd7d0f0edfa6f7d103c1b57 Objekt weist Speicherplatz zu; 2cc198a1d5eb0d3eb508d858c9f5cbdb Rufen Sie den Konstruktor der Unterklasse rekursiv auf heißt.

Beim Erstellen von Objekten sollten Sie einige wichtige Anwendungsregeln beachten:


& lt; 2 & gt; Zum Beispiel myObject = null.

& lt; 3 & gt;
                                                                                                                                                                                                  

(2) Bewerbungsphase

Während der Objektreferenzphase weist das Objekt die folgenden Eigenschaften auf:

f35d6e602fd7d0f0edfa6f7d103c1b57 Das System behält mindestens eine starke Referenz (starke Referenz) des Objekts bei; > ; Alle Verweise auf das Objekt sind starke Verweise (es sei denn, wir wenden ausdrücklich Folgendes an: Soft Reference, Weak Reference oder Phantom Reference): Bezieht sich auf den JVM-Speichermanager, der alle Pfade zu durchläuft Objekte im Heap, beginnend mit der Stammreferenzsammlung. Wenn ein Pfad zu einem Objekt kein Referenzobjekt enthält, wird die Referenz auf das Objekt als starke Referenz bezeichnet.

Soft Reference: Das Hauptmerkmal der Soft Reference ist ihre starke Referenzfunktion. Diese Art von Speicher wird nur zurückgefordert, wenn nicht genügend Speicher vorhanden ist. Sie werden daher normalerweise nicht zurückgefordert, wenn genügend Speicher vorhanden ist. Darüber hinaus wird garantiert, dass diese Referenzobjekte auf Null gesetzt werden, bevor Java eine OutOfMemory-Ausnahme auslöst. Es kann zum Zwischenspeichern einiger häufig verwendeter Ressourcen und zum Implementieren der Cache-Funktion verwendet werden, um eine maximale Speichernutzung sicherzustellen, ohne OutOfMemory zu verursachen.

Das Folgende ist der Implementierungscode der Soft-Referenz:

Durch die Einführung der Soft-Reference-Technologie können Java-Anwendungen den Speicher besser verwalten, das System stabilisieren, einen Systemspeicherüberlauf verhindern und vermeiden System stürzt ab. Daher sollte diese Technologie so weit wie möglich angewendet werden, wenn es um Objekte geht, die viel Speicher belegen und einen langen Lebenszyklus haben, aber nicht häufig verwendet werden. Verbessern Sie die Systemstabilität.

Schwache Referenz: Der größte Unterschied zwischen schwachen Anwendungsobjekten und weichen Referenzobjekten besteht darin, dass GC bei der Garbage Collection einen Algorithmus verwenden muss, um zu prüfen, ob weiche Anwendungsobjekte und schwache Referenzen recycelt werden sollen , GC sammelt immer. Schwache Referenzobjekte können von GC einfacher und schneller recycelt werden. In Kartenstrukturen werden häufig schwache Referenzobjekte verwendet.
        import java.lang.ref.SoftReference;
        ...
          
        A a = new A();
        ...
 
        // 使用a
        ...
          
        // 使用完了a, 将它设置为soft引用类型,并且释放强引用
        SoftReference sr = new SoftReference(a);
        a = null;
        ...
 
        // 下次使用时
  if (sr != null) {
  a = sr.get();
} else {
  // GC由于低内存,已释放a,因此需要重新装载
          a = new A();
  sr = new SoftReference(a);
}


Phantomreferenz: Phantomreferenz hat weniger Verwendungszwecke und wird hauptsächlich zur Unterstützung der Verwendung der Finalisierungsfunktion verwendet.

Phantom-Referenzobjekte beziehen sich auf Objekte, die die Finalisierungsfunktion abgeschlossen haben und nicht erreichbar sind, aber noch nicht vom GC recycelt wurden. Diese Art von Objekt kann bei der Fertigstellung einiger späterer Recyclingarbeiten hilfreich sein. Wir haben die Flexibilität des Ressourcenrecyclingmechanismus durch Überschreiben der Methode „clear()“ von Reference verbessert.

import java.lang.ref.WeakReference;  
                ...  
                  
               A a = new A();  
               ...  
  
               // 使用a  
               ...  
                  
               // 使用完了a, 将它设置为Weak引用类型,并且释放强引用  
               WeakReference wr = new WeakReference(a);  
               a = null;  
                ...  
               // 下次使用时  
       if (wr != null) {  
         a = wr.get();  
      } else {  
                  a = new A();  
        wr = new WeakReference(a);  
    }
In der tatsächlichen Programmierung werden schwache Referenzen und virtuelle Referenzen seltener verwendet, da weiche Referenzen die Wiederherstellung von Speichermüll durch die JVM beschleunigen und die Sicherheit des Systems verhindern können B. ein Speicherüberlauf (OutOfMemory), verhindert werden.

(3) Unsichtbare Phase

Wenn sich ein Objekt in der unsichtbaren Phase befindet, bedeutet dies, dass wir in anderen Codebereichen nicht mehr darauf verweisen können und seine starke Referenz verschwunden ist . Beispielsweise überschreitet eine lokale Variable ihren sichtbaren

-Bereich.


(4) Nicht erreichbare Phase


Objekte in der nicht erreichbaren Phase können keine direkten oder indirekten starken Referenzen mehr in der Objektreferenz-Stammsammlung der virtuellen Maschine finden Objekte sind im Allgemeinen temporäre Variablen in allen Thread-Stacks. Alle geladenen statischen Variablen oder Verweise auf native Codeschnittstellen.
try {  
      Object localObj = new Object();  
  localObj.doSomething();  
   } catch (Exception e) {  
     e.printStackTrace();  
   }  
  
   if (true) {  
  // 此区域中localObj 对象已经不可视了, 编译器会报错。  
  localObj.doSomething();  
   }

(5) Sammelphase, Endphase und Freigabephase

Wenn sich ein Objekt in der Sammelphase, Endphase und Freigabephase befindet, weist das Objekt die folgenden drei Situationen auf:

  f35d6e602fd7d0f0edfa6f7d103c1b57 Der Sammler hat festgestellt, dass das Objekt nicht mehr erreichbar ist.

2cc198a1d5eb0d3eb508d858c9f5cbdb Die finalize-Methode wurde ausgeführt.

  5bdf4c78156c7953567bb5a0aef2fc53 Der Objektraum wurde wiederverwendet.

Vielen Dank fürs Lesen, ich hoffe, es kann Ihnen helfen, vielen Dank für Ihre Unterstützung dieser Website!

Weitere Artikel zu Javas detaillierter Erklärung der Garbage Collection und des Objektlebenszyklus finden Sie auf der chinesischen PHP-Website!

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