c# Garbage Collection (Garbage Collection)

In C# ist die Garbage Collection ( Garbage Collection ) ein Mechanismus zur automatischen Speicherverwaltung. Es ist dafür verantwortlich, nicht mehr verwendeten Speicher zu verfolgen und freizugeben, damit Programme Speicherressourcen effizient nutzen können.

Der Garbage Collector in C# wird von der .NET Runtime (CLR) bereitgestellt und verwaltet. Es verwendet eine Strategie namens „Generationsrecycling“. Konkret unterteilt der Garbage Collector Speicherobjekte in drei Generationen: Generation 0, Generation 1 und Generation 2. Neu angelegte Objekte werden zunächst der Generation 0 zugeordnet. Wenn der Garbage Collector mit der Ausführung beginnt, überprüft er alle Objekte und markiert diejenigen, auf die noch verwiesen wird. Anschließend werden diese nicht referenzierten Objekte bereinigt und der von ihnen belegte Speicher freigegeben. Der von den bereinigten Objekten belegte Speicherplatz wird zurückgewonnen und kann für die Zuweisung neuer Objekte wieder verwendet werden.

Hier sind einige wichtige Konzepte zur C#-Garbage Collection:

Referenzzählung: Einige Programmiersprachen verwenden die Referenzzählung, um die Anzahl der Referenzen auf ein Speicherobjekt zu verfolgen. Wenn der Referenzzähler auf Null sinkt, wird das Objekt als Müll betrachtet und eingesammelt. In C# verwendet der Garbage Collector jedoch andere Strategien anstelle der einfachen Referenzzählung.

Finalizer-Methode: Bevor das Objekt in den Müll gesammelt wird, können Sie einige Reinigungsvorgänge durchführen, indem Sie die Finalizer-Methode definieren. Finalizer-Methoden werden automatisch von der CLR aufgerufen. In C# können Sie eine Finalizer-Methode mithilfe der ~ClassName-Syntax definieren.

Dispose- Methode: Die Dispose-Methode ist eine Möglichkeit, nicht verwaltete Ressourcen wie offene Dateien oder Datenbankverbindungen explizit freizugeben. Nachdem Sie diese Ressourcen verwendet haben, sollten Sie die Dispose-Methode des Objekts aufrufen, um sie freizugeben, sodass die Ressourcen unmittelbar vor der Speicherbereinigung freigegeben werden.

In den meisten Fällen müssen Sie die Speicherbereinigung nicht manuell steuern. Der Garbage Collector wird automatisch ausgeführt und gewinnt bei Bedarf Speicher zurück, der nicht mehr verwendet wird. Sie können jedoch die von der GC-Klasse bereitgestellten Methoden verwenden, um das Verhalten der Speicherbereinigung zu steuern. Beispielsweise kann die Methode GC.Collect() die Speicherbereinigung erzwingen und die Methode GC.GetTotalMemory() die Gesamtspeichermenge abrufen momentan benutzt.

Kurz gesagt: Der Garbage-Collection-Mechanismus von C# wird die Speicherverwaltung erheblich vereinfachen, sodass sich Entwickler mehr auf die Geschäftslogik konzentrieren können, ohne sich um die manuelle Verwaltung von Speicherressourcen kümmern zu müssen.
In C# sind Dispose und Destructor (Finalizer) zwei verschiedene Mechanismen zum Freigeben von Ressourcen.


1.Dispose-Methode : Die Dispose-Methode ist eine Möglichkeit, nicht verwaltete Ressourcen explizit freizugeben. Nicht verwaltete Ressourcen sind Ressourcen, die vom lokalen Betriebssystem oder anderen externen Ressourcen zugewiesen werden, z. B. offene Dateihandles, Datenbankverbindungen usw. Die Dispose-Methode muss vom Programmierer manuell aufgerufen werden, um sicherzustellen, dass nicht verwaltete Ressourcen rechtzeitig freigegeben werden. Normalerweise wird die Dispose-Methode sofort aufgerufen, nachdem das Objekt die Verwendung nicht verwalteter Ressourcen beendet hat.
Um die Dispose-Methode korrekt nutzen zu können, stellt C# eine Schnittstelle IDisposable zur Verfügung. Klassen, die die IDisposable-Schnittstelle implementieren, müssen die Dispose-Methode implementieren. Sie können die Dispose-Methode manuell aufrufen oder die using-Anweisung von C# verwenden, um die Dispose-Methode automatisch aufzurufen, wenn Sie den using-Block verlassen. Die Namenskonvention für Dispose-Methoden besteht darin, mit Dispose zu beginnen, z. B. Dispose().

Hier ist ein Beispiel, das zeigt, wie Sie mit der Dispose-Methode nicht verwaltete Ressourcen freigeben:

class MyClass : IDisposable
{
    
    
    private IntPtr handle; // 非托管资源

    public void Dispose()
    {
    
    
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
    
    
        if (disposing)
        {
    
    
            // 释放托管资源
        }

        // 释放非托管资源
        // ...
    }

    ~MyClass()
    {
    
    
        Dispose(false);
    }
}

using (MyClass obj = new MyClass())
{
    
    
    // 使用 obj 对象
} // 在这里自动调用 Dispose 方法

2. Destruktor (Finalizer) : Der Destruktor ist ein Mechanismus zum Freigeben von Ressourcen, aber im Gegensatz zur Dispose-Methode wird der Destruktor automatisch vom Garbage Collector aufgerufen und nicht manuell vom Programmierer. Der Destruktor wird ausgeführt, bevor das Objekt durch Garbage Collection erfasst wird, und wird zum Bereinigen der vom Objekt gehaltenen Ressourcen verwendet. In C# werden Destruktoren mithilfe der ~ClassName-Syntax definiert.
Es ist zu beachten, dass der Ausführungszeitpunkt des Destruktors vom Garbage Collector bestimmt wird, sodass nicht garantiert werden kann, dass er sofort ausgeführt wird, wenn auf das Objekt nicht mehr verwiesen wird. Da der Garbage Collector den Speicher automatisch verwaltet, besteht in den meisten Fällen keine Notwendigkeit, explizit einen Destruktor zu verwenden. Wenn ein Objekt jedoch nicht verwaltete Ressourcen enthält, kann in einigen Fällen ein Destruktor verwendet werden, um sicherzustellen, dass diese Ressourcen rechtzeitig freigegeben werden.

Hier ist ein Beispiel, das zeigt, wie ein Destruktor verwendet wird, um nicht verwaltete Ressourcen freizugeben:

class MyClass
{
    
    
    private IntPtr handle; // 非托管资源

    ~MyClass()
    {
    
    
        // 释放非托管资源
        // ...
    }
}

**```
总结:**
Dispose方法是一种显式释放非托管资源的方式,需要由程序员手动调用或使用using语句。析构函数是一种自动释放资源的机制,由垃圾回收器调用。在C#中,推荐使用Dispose方法来释放资源,而析构函数则主要用于处理非托管资源的释放。

Guess you like

Origin blog.csdn.net/qq_41942413/article/details/132633529