GC Klasse

Definition

Steuert den Garbage Collector des Systems. Das ist ein Dienst, der nicht verwendeten Speicher automatisch freigibt.

public ref class GC abstract sealed
public ref class GC sealed
public static class GC
public sealed class GC
type GC = class
Public Class GC
Public NotInheritable Class GC
Vererbung
GC

Beispiele

Im folgenden Beispiel werden mehrere GC-Methoden verwendet, um Generierungs- und Arbeitsspeicherinformationen zu einem Block nicht verwendeter Objekte abzurufen und in der Konsole auszugeben. Die nicht verwendeten Objekte werden dann gesammelt, und die resultierenden Arbeitsspeichergesamtsummen werden angezeigt.

using namespace System;
const long maxGarbage = 1000;
ref class MyGCCollectClass
{
public:
   void MakeSomeGarbage()
   {
      Version^ vt;
      for ( int i = 0; i < maxGarbage; i++ )
      {
         
         // Create objects and release them to fill up memory
         // with unused objects.
         vt = gcnew Version;

      }
   }

};

int main()
{
   MyGCCollectClass^ myGCCol = gcnew MyGCCollectClass;
   
   // Determine the maximum number of generations the system
   // garbage collector currently supports.
   Console::WriteLine( "The highest generation is {0}", GC::MaxGeneration );
   myGCCol->MakeSomeGarbage();
   
   // Determine which generation myGCCol object is stored in.
   Console::WriteLine( "Generation: {0}", GC::GetGeneration( myGCCol ) );
   
   // Determine the best available approximation of the number
   // of bytes currently allocated in managed memory.
   Console::WriteLine( "Total Memory: {0}", GC::GetTotalMemory( false ) );
   
   // Perform a collection of generation 0 only.
   GC::Collect( 0 );
   
   // Determine which generation myGCCol object is stored in.
   Console::WriteLine( "Generation: {0}", GC::GetGeneration( myGCCol ) );
   Console::WriteLine( "Total Memory: {0}", GC::GetTotalMemory( false ) );
   
   // Perform a collection of all generations up to and including 2.
   GC::Collect( 2 );
   
   // Determine which generation myGCCol object is stored in.
   Console::WriteLine( "Generation: {0}", GC::GetGeneration( myGCCol ) );
   Console::WriteLine( "Total Memory: {0}", GC::GetTotalMemory( false ) );
}
using System;

namespace GCCollectIntExample
{
    class MyGCCollectClass
    {
        private const long maxGarbage = 1000;

        static void Main()
        {
            MyGCCollectClass myGCCol = new MyGCCollectClass();

            // Determine the maximum number of generations the system
        // garbage collector currently supports.
            Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);

            myGCCol.MakeSomeGarbage();

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

            // Determine the best available approximation of the number
        // of bytes currently allocated in managed memory.
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

            // Perform a collection of generation 0 only.
            GC.Collect(0);

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

            // Perform a collection of all generations up to and including 2.
            GC.Collect(2);

            // Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
            Console.Read();
        }

        void MakeSomeGarbage()
        {
            Version vt;

            for(int i = 0; i < maxGarbage; i++)
            {
                // Create objects and release them to fill up memory
        // with unused objects.
                vt = new Version();
            }
        }
    }
}
Namespace GCCollectInt_Example
    Class MyGCCollectClass
        Private maxGarbage As Long = 10000

        Public Shared Sub Main()
            Dim myGCCol As New MyGCCollectClass

            'Determine the maximum number of generations the system
            'garbage collector currently supports.
            Console.WriteLine("The highest generation is {0}", GC.MaxGeneration)

            myGCCol.MakeSomeGarbage()

            'Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol))

            'Determine the best available approximation of the number 
            'of bytes currently allocated in managed memory.
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(False))

            'Perform a collection of generation 0 only.
            GC.Collect(0)

            'Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol))

            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(False))

            'Perform a collection of all generations up to and including 2.
            GC.Collect(2)

            'Determine which generation myGCCol object is stored in.
            Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol))
            Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(False))
            Console.Read()

        End Sub


        Sub MakeSomeGarbage()
            Dim vt As Version

            Dim i As Integer
            For i = 0 To maxGarbage - 1
                'Create objects and release them to fill up memory
                'with unused objects.
                vt = New Version
            Next i
        End Sub
    End Class
End Namespace

Hinweise

Der Garbage Collector ist eine Common Language Runtime-Komponente, die die Zuordnung und Freigabe von verwaltetem Arbeitsspeicher steuert. Die Methoden in dieser Klasse beeinflussen, wann die Garbage Collection für ein Objekt ausgeführt wird und wenn von einem Objekt zugeordnete Ressourcen freigegeben werden. Eigenschaften in dieser Klasse bieten Informationen zur Gesamtmenge des im System verfügbaren Arbeitsspeichers und zur Alterskategorie bzw. Generierung des Arbeitsspeichers, der einem Objekt zugeordnet ist.

Der Garbage Collector verfolgt objekte, die im verwalteten Speicher zugeordnet sind, und gibt sie wieder her. In regelmäßigen Abständen führt der Garbage Collector eine Garbage Collection durch, um Arbeitsspeicher für Objekte wiederzuerlangen, für die keine gültigen Verweise vorhanden sind. Die Garbage Collection erfolgt automatisch, wenn eine Speicheranforderung mit dem verfügbaren freien Arbeitsspeicher nicht erfüllt werden kann. Alternativ kann eine Anwendung die Garbage Collection mithilfe der Collect -Methode erzwingen.

Die Garbage Collection besteht aus den folgenden Schritten:

  1. Der Garbage Collector sucht nach verwalteten Objekten, auf die in verwaltetem Code verwiesen wird.

  2. Der Garbage Collector versucht, Objekte fertig zu stellen, auf die nicht verwiesen wird.

  3. Der Garbage Collector gibt Objekte frei, auf die nicht verwiesen wird, und gibt ihren Arbeitsspeicher frei.

Dieses Thema enthält die folgenden Abschnitte:

Garbage Collector und nicht verwaltete Ressourcen
Objektalterung und -generationen
Nichtermöglichung der Garbage Collection

Garbage Collector und nicht verwaltete Ressourcen

Während einer Auflistung gibt der Garbage Collector kein Objekt frei, wenn er einen oder mehrere Verweise auf das Objekt in verwaltetem Code findet. Der Garbage Collector erkennt jedoch keine Verweise auf ein Objekt aus nicht verwaltetem Code und gibt möglicherweise Objekte frei, die ausschließlich in nicht verwaltetem Code verwendet werden, es sei denn, dies wird explizit verhindert. Die KeepAlive -Methode stellt einen Mechanismus bereit, der verhindert, dass der Garbage Collector Objekte sammelt, die noch in nicht verwaltetem Code verwendet werden.

Abgesehen von verwalteten Speicherbelegungen verwalten Implementierungen des Garbage Collectors keine Informationen zu Ressourcen, die von einem Objekt gespeichert werden, z. B. Dateihandles oder Datenbankverbindungen. Wenn ein Typ nicht verwaltete Ressourcen verwendet, die freigegeben werden müssen, bevor Instanzen des Typs freigegeben werden, kann der Typ einen Finalizer implementieren.

In den meisten Fällen werden Finalizer durch Überschreiben der Object.Finalize -Methode implementiert. In C# oder C++ geschriebene Typen implementieren jedoch Destruktoren, die Compiler in eine Überschreibung von Object.Finalize umwandeln. Wenn ein Objekt über einen Finalizer verfügt, ruft der Garbage Collector es in den meisten Fällen auf, bevor das Objekt freigegeben wird. Der Garbage Collector ist jedoch nicht erforderlich, um Finalizer in allen Situationen aufzurufen. Beispielsweise verhindert die SuppressFinalize -Methode explizit, dass der Finalizer eines Objekts aufgerufen wird. Außerdem ist es nicht erforderlich, dass der Garbage Collector einen bestimmten Thread zum Abschließen von Objekten verwendet oder die Reihenfolge garantiert, in der Finalizer für Objekte aufgerufen werden, die aufeinander verweisen, aber andernfalls für die Garbage Collection verfügbar sind.

In Szenarien, in denen Ressourcen zu einem bestimmten Zeitpunkt freigegeben werden müssen, können Klassen die IDisposable -Schnittstelle implementieren, die die Methode enthält, IDisposable.Dispose die Ressourcenverwaltungs- und Bereinigungsaufgaben ausführt. Klassen, die Dispose implementieren, müssen im Rahmen ihres Klassenvertrags angeben, ob und wann Klassenverbraucher die -Methode aufrufen, um das Objekt zu bereinigen. Der Garbage Collector ruft die -Methode standardmäßig nicht Dispose auf. Implementierungen der -Methode können jedoch Dispose Methoden in der -Klasse aufrufen, GC um das Finalisierungsverhalten des Garbage Collectors anzupassen.

Weitere Informationen zum Objektabschluss und zum Dispose-Muster finden Sie unter Bereinigen von nicht verwalteten Ressourcen.

Objektalterung und -generationen

Der Garbage Collector in der Common Language Runtime unterstützt das Altern von Objekten mithilfe von Generationen. Eine Generierung ist eine Maßeinheit für das relative Alter von Objekten im Arbeitsspeicher. Die Generierungsnummer oder das Alter eines Objekts gibt die Generierung an, zu der ein Objekt gehört. Objekte, die vor kurzem erstellt wurden, sind Teil neuerer Generationen und weisen niedrigere Generierungszahlen auf als Objekte, die zuvor im Lebenszyklus der Anwendung erstellt wurden. Objekte in der neuesten Generation befinden sich in Generation 0. Diese Implementierung des Garbage Collectors unterstützt drei Generationen von Objekten, die Generationen 0, 1 und 2. Sie können den Wert der MaxGeneration -Eigenschaft abrufen, um die maximale Generierungsnummer zu bestimmen, die vom System unterstützt wird.

Die Objektalterung ermöglicht Es Anwendungen, die Garbage Collection für eine bestimmte Gruppe von Generationen als Ziel festzulegen, anstatt zu verlangen, dass der Garbage Collector alle Generationen auswertet. Überladungen der Collect -Methode, die einen generation -Parameter enthalten, ermöglichen es Ihnen, die älteste Generierung anzugeben, die zur Garbage Collection verwendet werden soll.

Nichtermöglichung der Garbage Collection

Ab .NET Framework 4.6 unterstützt der Garbage Collector einen Latenzmodus ohne GC-Region, der während der Ausführung kritischer Pfade verwendet werden kann, in dem sich die Garbage Collection negativ auf die Leistung einer App auswirken kann. Der Latenzmodus "Keine GC-Region" erfordert, dass Sie eine Menge an Arbeitsspeicher angeben, die ohne Beeinträchtigung durch den Garbage Collector zugeordnet werden kann. Wenn die Laufzeit diesen Arbeitsspeicher zuordnen kann, führt die Laufzeit keine Garbage Collection durch, während Code im kritischen Pfad ausgeführt wird.

Sie definieren den Anfang des kritischen Pfads des bereichs no GC, indem Sie eine der Überladungen von TryStartNoGCRegion aufrufen. Sie geben das Ende des kritischen Pfads an, indem Sie die EndNoGCRegion -Methode aufrufen.

Sie können keine Aufrufe der TryStartNoGCRegion -Methode schachteln, und Sie sollten die -Methode nur EndNoGCRegion aufrufen, wenn sich die Laufzeit derzeit im Latenzmodus für die GC-Region befindet. Anders ausgedrückt: Sie sollten nicht mehrmals aufrufen TryStartNoGCRegion (nach dem ersten Methodenaufruf sind nachfolgende Aufrufe nicht erfolgreich), und Sie sollten nicht erwarten, dass EndNoGCRegion Aufrufe erfolgreich sind, nur weil der erste Aufruf TryStartNoGCRegion von erfolgreich war.

Eigenschaften

MaxGeneration

Ruft die maximale Anzahl von Generationen ab, die das System gegenwärtig unterstützt.

Methoden

AddMemoryPressure(Int64)

Informiert die Laufzeit über eine große Belegung von nicht verwaltetem Arbeitsspeicher, der beim Planen der Garbage Collection in Erwägung gezogen werden muss.

AllocateArray<T>(Int32, Boolean)

Ordnet ein Array zu.

AllocateUninitializedArray<T>(Int32, Boolean)

Ordnet ein Array zu, während die Nullinitialisierung nach Möglichkeit übersprungen wird.

CancelFullGCNotification()

Bricht die Registrierung einer Garbage Collection-Benachrichtigung ab.

Collect()

Erzwingt eine sofortige Garbage Collection für alle Generationen.

Collect(Int32)

Erzwingt eine sofortige Garbage Collection von Generation 0 (null) bis zu einer angegebenen Generation.

Collect(Int32, GCCollectionMode)

Erzwingt eine Garbage Collection von Generation 0 (null) bis zu einer angegebenen Generation zu einem durch einen GCCollectionMode-Wert angegebenen Zeitpunkt.

Collect(Int32, GCCollectionMode, Boolean)

Erzwingt eine Garbage Collection von Generation 0 (null) bis zu einer angegebenen Generation, angegeben durch jeweils einen GCCollectionMode-Wert und mit einem Wert, der angibt, ob die Auflistung blockieren soll.

Collect(Int32, GCCollectionMode, Boolean, Boolean)

Erzwingt eine Garbage Collection von Generation 0 (null) bis zu einer angegebenen Generation, angegeben durch jeweils einen GCCollectionMode-Wert und mit Werten, die angeben, ob die Auflistung blockieren und komprimieren soll.

CollectionCount(Int32)

Gib die Anzahl zurück, wie oft die Garbage Collection für die angegebene Objektgeneration stattgefunden hat.

EndNoGCRegion()

Beendet den Latenzmodus ohne GC-Region.

GetAllocatedBytesForCurrentThread()

Ruft die Gesamtzahl der Bytes ab, die dem aktuellen Thread seit Beginn seiner Lebensdauer zugeordnet wurden.

GetGCMemoryInfo()

Ruft Arbeitsspeicherinformationen für die Garbage Collection ab.

GetGCMemoryInfo(GCKind)

Ruft Arbeitsspeicherinformationen für die Garbage Collection ab.

GetGeneration(Object)

Gibt die aktuelle Generationszahl des angegebenen Objekts zurück.

GetGeneration(WeakReference)

Gibt die aktuelle Generationszahl für das Ziel eines angegebenen schwachen Verweises zurück.

GetTotalAllocatedBytes(Boolean)

Ruft die Anzahl der Bytes ab, die über die Lebensdauer des Prozesses zugeordnet wurden. Der zurückgegebene Wert enthält keine nativen Zuordnungen.

GetTotalMemory(Boolean)

Ruft einen Schätzwert für die reservierte Anzahl von Bytes ab. Ein Parameter gibt an, ob diese Methode vor der Rückgabe eine kurze Zeit warten kann, damit das System die Garbage Collection durchführen und Objekte finalisieren kann.

KeepAlive(Object)

Verweist auf das angegebene Objekt und nimmt es von Beginn der aktuellen Routine bis zum Zeitpunkt des Aufrufs dieser Methode von der Garbage Collection aus.

RegisterForFullGCNotification(Int32, Int32)

Gibt an, dass eine Garbage Collection-Benachrichtigung ausgelöst werden soll, wenn eine vollständige Garbage Collection durch die Bedingungen begünstigt wird und wenn die Garbage Collection abgeschlossen wurde.

RemoveMemoryPressure(Int64)

Informiert die Laufzeit, dass nicht verwalteter Arbeitsspeicher freigegeben wurde und beim Planen der Garbage Collection nicht mehr berücksichtigt werden muss.

ReRegisterForFinalize(Object)

Fordert beim System den Aufruf des Finalizers für das angegebene Objekt an, für das zuvor SuppressFinalize(Object) aufgerufen wurde.

SuppressFinalize(Object)

Fordert die Common Language Runtime auf, den Finalizer für das angegebene Objekt nicht aufzurufen.

TryStartNoGCRegion(Int64)

Versucht, Garbage Collection während der Ausführung eines kritischen Pfads zu unterbinden, wenn eine bestimmte Arbeitsspeichermenge verfügbar ist.

TryStartNoGCRegion(Int64, Boolean)

Versucht, Garbage Collection während der Ausführung eines kritischen Pfads zu unterbinden, wenn eine bestimmte Arbeitsspeichermenge verfügbar ist, und steuert die Ausführung einer vollständigen blockierenden Garbage Collection durch den Garbage Collector, wenn nicht genügend Arbeitsspeicher verfügbar ist.

TryStartNoGCRegion(Int64, Int64)

Versucht, Garbage Collection während der Ausführung eines kritischen Pfads zu unterbinden, wenn eine bestimmte Arbeitsspeichermenge für den großen und den kleinen Objektheap verfügbar ist.

TryStartNoGCRegion(Int64, Int64, Boolean)

Versucht, Garbage Collection während der Ausführung eines kritischen Pfads zu unterbinden, wenn eine bestimmte Arbeitsspeichermenge für den großen und den kleinen Objektheap verfügbar ist, und steuert die Ausführung einer vollständigen blockierenden Garbage Collection durch den Garbage Collector, wenn nicht genügend Arbeitsspeicher verfügbar ist.

WaitForFullGCApproach()

Gibt den Status einer registrierten Benachrichtigung zurück, um zu bestimmen, ob eine vollständige blockierende Garbage Collection durch die Common Language Runtime bevorsteht.

WaitForFullGCApproach(Int32)

Gibt innerhalb einer angegebenen Timeoutspanne den Status einer registrierten Benachrichtigung zurück, um zu bestimmen, ob eine vollständige blockierende Garbage Collection durch die Common Language Runtime bevorsteht.

WaitForFullGCComplete()

Gibt den Status einer registrierten Benachrichtigung zurück, um zu bestimmen, ob eine vollständige blockierende Garbage Collection durch die Common Language Runtime abgeschlossen wurde.

WaitForFullGCComplete(Int32)

Gibt innerhalb einer angegebenen Timeoutspanne den Status einer registrierten Benachrichtigung zurück, um zu bestimmen, ob eine vollständige blockierende Garbage Collection durch die Common Language Runtime abgeschlossen wurde.

WaitForPendingFinalizers()

Hält den aktuellen Thread so lange an, bis der Thread, der die Finalizerwarteschlange verarbeitet, diese Warteschlange geleert hat.

Gilt für

Siehe auch