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

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

Jan 17, 2017 pm 03:50 PM

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:

<1> Objekt weist Speicherplatz zu; <2> 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:

<1> 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);
}
Nach dem Login kopieren


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);  
    }
Nach dem Login kopieren
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();  
   }
Nach dem Login kopieren

(5) Sammelphase, Endphase und Freigabephase

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

  <1> Der Sammler hat festgestellt, dass das Objekt nicht mehr erreichbar ist.

<2> Die finalize-Methode wurde ausgeführt.

  <3> 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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Apr 19, 2025 pm 04:51 PM

Fehlerbehebung und Lösungen für die Sicherheitssoftware des Unternehmens, die dazu führt, dass einige Anwendungen nicht ordnungsgemäß funktionieren. Viele Unternehmen werden Sicherheitssoftware bereitstellen, um die interne Netzwerksicherheit zu gewährleisten. ...

Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Apr 19, 2025 pm 06:21 PM

Die Verarbeitung von Feldzuordnungen im Systemdocken stößt häufig auf ein schwieriges Problem bei der Durchführung von Systemdocken: So kartieren Sie die Schnittstellenfelder des Systems und ...

Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Apr 19, 2025 pm 11:42 PM

Bei Verwendung von MyBatis-Plus oder anderen ORM-Frameworks für Datenbankvorgänge müssen häufig Abfragebedingungen basierend auf dem Attributnamen der Entitätsklasse erstellt werden. Wenn Sie jedes Mal manuell ...

Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Apr 19, 2025 pm 11:45 PM

Beginnen Sie den Frühling mit der Intellijideaultimate -Version ...

Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Apr 19, 2025 pm 11:30 PM

Lösungen zum Umwandeln von Namen in Zahlen zur Implementierung der Sortierung in vielen Anwendungsszenarien müssen Benutzer möglicherweise in Gruppen sortieren, insbesondere in einem ...

Wie kann ich Java -Objekte sicher in Arrays umwandeln? Wie kann ich Java -Objekte sicher in Arrays umwandeln? Apr 19, 2025 pm 11:33 PM

Konvertierung von Java-Objekten und -Arrays: Eingehende Diskussion der Risiken und korrekten Methoden zur Konvertierung des Guss-Typs Viele Java-Anfänger werden auf die Umwandlung eines Objekts in ein Array stoßen ...

Wie kann ich elegant den variablen Entitätsklassennamen erstellen, wenn Tkmybatis für Datenbankabfrage verwendet werden? Wie kann ich elegant den variablen Entitätsklassennamen erstellen, wenn Tkmybatis für Datenbankabfrage verwendet werden? Apr 19, 2025 pm 09:51 PM

Wenn Sie TKMybatis für Datenbankabfragen verwenden, ist das Aufbau von Abfragebedingungen ein häufiges Problem. Dieser Artikel wird ...

Warum verursacht das Frühlingsprojekt beim Starten aufgrund von kreisförmigen Abhängigkeiten Zufälligkeitsprobleme? Warum verursacht das Frühlingsprojekt beim Starten aufgrund von kreisförmigen Abhängigkeiten Zufälligkeitsprobleme? Apr 19, 2025 pm 11:21 PM

Verstehen Sie die Zufälligkeit von kreisförmigen Abhängigkeiten beim Start des Frühlingsprojekts. Bei der Entwicklung des Frühlingsprojekts können Sie Zufälligkeit begegnen, die durch kreisförmige Abhängigkeiten beim Projektstart verursacht werden ...

See all articles