Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in den .Net-Garbage-Collection-Mechanismus

Detaillierte Einführung in den .Net-Garbage-Collection-Mechanismus

高洛峰
高洛峰Original
2016-12-20 14:13:331686Durchsuche

Destruktor

Der Destruktor darf keine Modifikatoren wie „public“ haben. Es können keine Parameter akzeptiert werden.

Der Compiler konvertiert einen Destruktor automatisch wie folgt in eine Überschreibungsversion der Object.Finalize-Methode.

class Test
{
  protected override void Finalize()
  {
    try {…}
    finally { base.Finalize(); }
  }
}

Garbage Collector

.NET Garbage Collector sorgt dafür:

l Jeder Das Objekt wird zerstört und sein Destruktor wird ausgeführt. Wenn ein Programm endet, werden alle Objekte zerstört.
l Jedes Objekt wird nur einmal zerstört.
l Jedes Objekt wird nur zerstört, wenn es nicht erreichbar ist (dh wenn kein Verweis auf das Objekt vorhanden ist).

Arbeitsmethode:

1) Es wird eine Karte erstellt, die alle erreichbaren Objekte enthält. Dazu folgt es wiederholt den Referenzfeldern im Objekt. Der Garbage Collector erstellt diese Karte sehr sorgfältig und stellt sicher, dass sich zyklische Referenzen nicht unendlich wiederholen. Kein Objekt auf dieser Karte wird als unerreichbar betrachtet.
2) Es wird geprüft, ob für nicht erreichbare Objekte ein Destruktor vorhanden ist, der ausgeführt werden muss (der Prozess der Ausführung eines Destruktors wird als Finalisierung bezeichnet). Alle nicht erreichbaren Objekte, die finalisiert werden müssen, werden in eine spezielle Warteschlange gestellt. Diese Warteschlange wird als Freachable-Warteschlange bezeichnet.
3) Es recycelt die verbleibenden nicht erreichbaren Objekte (d. h. Objekte, die keiner Finalisierung bedürfen). Dazu werden erreichbare Objekte im Heap nach unten verschoben, wodurch der Heap defragmentiert und der oben im Heap befindliche Speicher freigegeben wird. Wenn der Garbage Collector ein erreichbares Objekt verschiebt, aktualisiert er auch den Verweis auf das Objekt.
4) Es ermöglicht dann anderen Threads, die Ausführung fortzusetzen.
5) Es führt den Finalisierungsvorgang für nicht erreichbare Objekte (in der Freachable-Warteschlange) durch, die eine Finalisierung in einem separaten Thread erfordern.

Aus der obigen Zusammenfassung ist ersichtlich, dass die Existenz des Destruktors dazu führt, dass der obige Prozess zwei weitere Schritte ausführt, 2 und 5. Erwägen Sie daher die Verwendung von Blöcken anstelle von Generika. Wenn eine verwendete Klasse die Dispose-Methode (Close-Methode) implementiert. Es ist am besten, diese Methode endgültig aufzurufen (bevor Sie die Methode aufrufen, müssen Sie prüfen, ob das entsorgte Attribut des zu entsorgenden Objekts falsch ist, und nur entsorgen, wenn es nicht wahr ist. Dies ist auch der Grund, warum die Verwendung empfohlen wird . Mit kann dies leicht eingeschränkt werden (d. h. zwischen einem Paar geschweifter Klammern). Oder verwenden Sie einen using-Block, um den Code zu umgeben, der diese Klasse verwendet. Der im using-Block platzierte Objekttyp muss die IDisposable-Schnittstelle implementieren.

Standard-Reinigungsmodus

Abschließend wird ein von .NET empfohlener Standard-Reinigungsmoduscode angegeben, Beispielcode:

class MyClass : IDisposable
{
  private bool disposed = false;//Disposal 状态
 
  public void Dispose()//公有Dispose方法(可选实现IDisposal接口)
  {
    Dispose(true);
    GC.SuppressFinalize(this);
  }
 
  ~MyClass()
  {
    Dispose(false);
  }
 
  protected virtual void Dispose(bool disposing)
  {
    if (!disposed)
    {
      if (disposing)
      {
        //Dispose the managed resources.
      }
      //Dispose the unmanaged resources.
    }
    disposed = true;
  }
}

Im obigen Code rufen wir die Dispose-Methode vom Destruktor auf, die sicherstellt, dass Dispose ausgeführt wird. Darüber hinaus wird GC.SuppressFinalize(this); verwendet, um zu verhindern, dass der Compiler dieses Objekt zerstört.

Vielen Dank fürs Lesen, ich hoffe, es kann Ihnen helfen, vielen Dank für Ihre Unterstützung 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