GC Klasa

Definicja

Steruje systemowym modułem odśmiecającym śmieci, usługą, która automatycznie odzyskuje nieużywaną pamięć.

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
Dziedziczenie
GC

Przykłady

W poniższym przykładzie użyto kilku metod GC, aby pobrać informacje o generowaniu i pamięci o bloku nieużywanych obiektów i wydrukować je w konsoli. Nieużywane obiekty są następnie zbierane, a wynikowe sumy pamięci są wyświetlane.

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();
            }
        }
    }
}
open System

let maxGarbage = 1000

type MyGCCollectClass() =
    member _.MakeSomeGarbage() =
        for _ = 1 to maxGarbage do
            // Create objects and release them to fill up memory with unused objects.
            Version() |> ignore

[<EntryPoint>]
let main _ =
    let myGCCol = MyGCCollectClass()

    // Determine the maximum number of generations the system
    // garbage collector currently supports.
    printfn $"The highest generation is {GC.MaxGeneration}"

    myGCCol.MakeSomeGarbage()

    // Determine which generation myGCCol object is stored in.
    printfn $"Generation: {GC.GetGeneration myGCCol}"

    // Determine the best available approximation of the number
    // of bytes currently allocated in managed memory.
    printfn $"Total Memory: {GC.GetTotalMemory false}"

    // Perform a collection of generation 0 only.
    GC.Collect 0

    // Determine which generation myGCCol object is stored in.
    printfn $"Generation: {GC.GetGeneration myGCCol}"

    printfn $"Total Memory: {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.
    printfn $"Generation: {GC.GetGeneration myGCCol}"
    printfn $"Total Memory: {GC.GetTotalMemory false}"

    0
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

Uwagi

Klasa GC steruje modułem odśmiecającym śmieci. Kolektor odpadów jest składnikiem środowiska uruchomieniowego wspólnego języka, który kontroluje alokację i zwalnianie pamięci zarządzanej. Metody w tej klasie mają wpływ na to, kiedy czyszczenie pamięci jest wykonywane na obiekcie i kiedy zasoby przydzielone przez obiekt są zwalniane. Właściwości w tej klasie zawierają informacje o całkowitej ilości pamięci dostępnej w systemie i kategorii wiekowej lub generacji pamięci przydzielonej do obiektu.

Moduł odśmiecania pamięci śledzi i zwraca obiekty przydzielone w pamięci zarządzanej. Okresowo moduł odśmieceń pamięci wykonuje odzyskiwanie pamięci w celu odzyskania pamięci przydzielonej do obiektów, dla których nie ma prawidłowych odwołań. Automatyczne odśmiecanie pamięci zachodzi, gdy żądanie pamięci nie może być spełnione z dostępną wolną pamięcią. Alternatywnie aplikacja może wymusić zbieranie śmieci przy użyciu metody Collect.

Usuwanie niepotrzebnych danych składa się z następujących kroków:

  1. Zbieracz śmieci wyszukuje elementy zarządzane, do których odwołuje się kod zarządzany.
  2. Automat odśmiecania pamięci próbuje sfinalizować obiekty, które nie są referencjonowane.
  3. Moduł odśmiecający zwalnia obiekty, które nie są referencjonowane, i przywraca ich pamięć do użytku.

Zasoby niezarządzane

Podczas kolekcji, kolektor śmieci nie zwolni obiektu, jeśli znajdzie jeden lub więcej odwołań do obiektu w kodzie zarządzanym. Jednak moduł odśmiecanie pamięci nie rozpoznaje odwołań do obiektu z niezarządzanego kodu i może zwolnić obiekty, które są używane wyłącznie w kodzie niezarządzanym, chyba że jawnie tego nie uniemożliwiono. Metoda KeepAlive udostępnia mechanizm, który uniemożliwia kolektorowi śmieci zbieranie obiektów, które są nadal używane w kodzie zarządzanym ręcznie.

Oprócz alokacji pamięci zarządzanej implementacje kolektora odśmiecania pamięci nie zachowują informacji o zasobach, które przechowuje obiekt, takich jak uchwyty plików czy połączenia z bazą danych. Gdy typ używa niezarządzanych zasobów, które muszą zostać zwolnione przed odzyskaniem wystąpień typu, typ może zaimplementować finalizator.

W większości przypadków finalizatory są implementowane przez zastąpienie metody Object.Finalize, jednak typy napisane w językach C# lub C++ implementują destruktory, które kompilatory przekształcają w przesłonięcia metody Object.Finalize. W większości przypadków jeśli obiekt ma finalizator, garbage collector wywołuje go przed zwolnieniem obiektu. Jednak kolektor śmieci nie musi wywoływać finalizatorów we wszystkich sytuacjach; na przykład metoda SuppressFinalize jawnie uniemożliwia wywołanie finalizatora obiektu. Ponadto, zbieracz śmieci nie musi używać określonego wątku do finalizowania obiektów ani gwarantować kolejności wywoływania finalizatorów dla obiektów, które odwołują się do siebie, ale mimo to są dostępne do odzyskiwania pamięci.

W scenariuszach, gdzie zasoby muszą być zwolnione w określonym czasie, klasy mogą implementować IDisposable interfejs, zawierający metodę IDisposable.Dispose, która zarządza zasobami i wykonuje zadania oczyszczania. Klasy implementujące Dispose muszą określać w ramach kontraktu klasy, jeśli i kiedy odbiorcy klasy wywołają metodę w celu oczyszczenia obiektu. Mechanizm zbiersza śmieci domyślnie nie wywołuje metody Dispose. Jednakże implementacje metody Dispose mogą wywoływać metody klasy GC w celu dostosowania zachowania finalizacji zbiersza śmieci.

Aby uzyskać więcej informacji na temat finalizacji obiektów i wzorca usuwania, zobacz Czyszczenie zasobów niezarządzanych.

Starzenie się i generowanie obiektów

Kolektor odpadów w środowisku uruchomieniowym języka wspólnego obsługuje starzenie się obiektów za pomocą generacji. Generacja to jednostka miary względnego wieku obiektów w pamięci. Numer generacji lub wiek obiektu wskazuje generację, do której należy obiekt. Obiekty utworzone ostatnio są częścią nowszych generacji i mają numery niższej generacji niż obiekty utworzone wcześniej w cyklu życia aplikacji. Obiekty w najnowszej generacji są w generacji 0. Ta implementacja modułu odśmiecniania pamięci obsługuje trzy generacje obiektów, generacje 0, 1 i 2. Aby określić maksymalną liczbę generacji obsługiwaną przez system, można pobrać wartość właściwości MaxGeneration.

Starzenie się obiektów umożliwia aplikacjom kierowanie mechanizmu zbierania śmieci na określony zestaw generacji, a nie na ocenianie wszystkich generacji. Przeciążenia metody Collect, które zawierają parametr generation, umożliwiają określenie najstarszej generacji, która ma być do zebrania przez śmieciarz.

Wyłączenie automatycznego zwalniania pamięci

Kolektor odpadów obsługuje tryb opóźnienia bez GC, który może być używany podczas wykonywania ścieżek krytycznych, gdzie odśmiecanie pamięci może niekorzystnie wpłynąć na wydajność aplikacji. Tryb opóźnienia regionu bez GC wymaga określenia ilości pamięci, którą można przydzielić bez zakłóceń z modułu odśmiecającego pamięci. Jeśli środowisko uruchomieniowe może przydzielić tę pamięć, nie będzie wykonywać usuwania śmieci, kiedy wykonywany jest kod w krytycznej ścieżce.

Należy zdefiniować początek ścieżki krytycznej bez regionu GC przez wywołanie jednego z przeciążeń obiektu TryStartNoGCRegion. Należy określić koniec ścieżki krytycznej, wywołując metodę EndNoGCRegion .

Nie można zagnieżdżać wywołań metody TryStartNoGCRegion, a metodę EndNoGCRegion należy wywołać tylko wtedy, gdy środowisko uruchomieniowe jest obecnie w trybie opóźnienia regionu bez GC. Innymi słowy, nie należy wywoływać TryStartNoGCRegion wiele razy (po pierwszym wywołaniu metody kolejne wywołania nie powiedzie się) i nie należy oczekiwać, aby EndNoGCRegion wywołania zakończyły się powodzeniem tylko dlatego, że pierwsze wywołanie TryStartNoGCRegion zakończyło się pomyślnie.

Właściwości

Nazwa Opis
MaxGeneration

Pobiera maksymalną liczbę generacji, które obecnie obsługuje system.

Metody

Nazwa Opis
AddMemoryPressure(Int64)

Informuje środowisko uruchomieniowe o dużej alokacji niezarządzanej pamięci, którą należy wziąć pod uwagę podczas planowania odzyskiwania pamięci.

AllocateArray<T>(Int32, Boolean)

Przydziela tablicę.

AllocateUninitializedArray<T>(Int32, Boolean)

Przydziela tablicę, pomijając inicjowanie zerowe, jeśli to możliwe.

CancelFullGCNotification()

Anuluje rejestrację powiadomienia odzyskiwania pamięci.

Collect()

Wymusza natychmiastowe odzyskiwanie pamięci wszystkich pokoleń.

Collect(Int32, GCCollectionMode, Boolean, Boolean)

Wymusza odzyskiwanie pamięci z generacji 0 przez określoną generację GCCollectionMode , w czasie określonym przez wartość, z wartościami określającymi, czy kolekcja powinna blokować i kompaktować.

Collect(Int32, GCCollectionMode, Boolean)

Wymusza odzyskiwanie pamięci z generacji 0 przez określoną generację GCCollectionMode , w czasie określonym przez wartość, z wartością określającą, czy kolekcja powinna być blokowana.

Collect(Int32, GCCollectionMode)

Wymusza odzyskiwanie pamięci z generacji 0 przez określoną generację GCCollectionMode w czasie określonym przez wartość.

Collect(Int32)

Wymusza natychmiastowe odzyskiwanie pamięci z generacji 0 przez określoną generację.

CollectionCount(Int32)

Zwraca liczbę przypadków wystąpienia odzyskiwania pamięci przez określoną generację obiektów.

EndNoGCRegion()

Kończy tryb opóźnienia regionu GC.

GetAllocatedBytesForCurrentThread()

Pobiera łączną liczbę bajtów przydzielonych do bieżącego wątku od początku jego okresu istnienia.

GetConfigurationVariables()

Pobiera konfiguracje używane przez moduł odśmiecający śmieci.

GetGCMemoryInfo()

Pobiera informacje o pamięci odzyskiwania pamięci.

GetGCMemoryInfo(GCKind)

Pobiera informacje o pamięci odzyskiwania pamięci.

GetGeneration(Object)

Zwraca bieżącą liczbę generacji określonego obiektu.

GetGeneration(WeakReference)

Zwraca bieżącą liczbę generacji elementu docelowego określonego słabego odwołania.

GetTotalAllocatedBytes(Boolean)

Pobiera liczbę bajtów przydzielonych w okresie istnienia procesu. Zwrócona wartość nie zawiera żadnych alokacji natywnych.

GetTotalMemory(Boolean)

Pobiera rozmiar sterty z wyłączeniem fragmentacji. Jeśli na przykład całkowity rozmiar sterty GC wynosi 100 mb, a fragmentacja, tj. miejsce zajęte przez wolne obiekty, zajmuje 40 mb, ten interfejs API zgłosi 60 mb. Parametr wskazuje, czy ta metoda może poczekać krótki interwał przed zwróceniem, aby umożliwić systemowi zbieranie pamięci i finalizowanie obiektów.

GetTotalPauseDuration()

Pobiera całkowity czas wstrzymania w GC od początku procesu.

KeepAlive(Object)

Odwołuje się do określonego obiektu, co sprawia, że nie kwalifikuje się do odzyskiwania pamięci od początku bieżącej procedury do punktu, w którym jest wywoływana ta metoda.

RefreshMemoryLimit()

Nakazuje modułowi odśmiecania pamięci ponowne skonfigurowanie się, wykrywając różne limity pamięci w systemie.

RegisterForFullGCNotification(Int32, Int32)

Określa, że powiadomienie odzyskiwania pamięci powinno być zgłaszane, gdy warunki preferują pełne odzyskiwanie pamięci i po zakończeniu odzyskiwania pamięci.

RegisterNoGCRegionCallback(Int64, Action)

Rejestruje wywołanie zwrotne, które ma być wywoływane, gdy określona ilość pamięci jest przydzielana w regionie bez GC.

RemoveMemoryPressure(Int64)

Informuje środowisko uruchomieniowe, że pamięć niezarządzana została zwolniona i nie trzeba już uwzględniać podczas planowania odzyskiwania pamięci.

ReRegisterForFinalize(Object)

Żąda, aby system wywołał finalizator dla określonego obiektu, dla którego SuppressFinalize(Object) został wcześniej wywołany.

SuppressFinalize(Object)

Żąda, aby środowisko uruchomieniowe języka wspólnego nie wywoływać finalizatora dla określonego obiektu.

TryStartNoGCRegion(Int64, Boolean)

Próbuje uniemożliwić odzyskiwanie pamięci podczas wykonywania ścieżki krytycznej, jeśli jest dostępna określona ilość pamięci, i określa, czy moduł odśmiecania pamięci wykonuje pełne blokowanie odzyskiwania pamięci, jeśli początkowo jest dostępna za mało pamięci.

TryStartNoGCRegion(Int64, Int64, Boolean)

Próbuje uniemożliwić odzyskiwanie pamięci podczas wykonywania ścieżki krytycznej, jeśli określona ilość pamięci jest dostępna dla dużego sterta obiektu i sterta małego obiektu oraz określa, czy moduł odśmiecania pamięci wykonuje pełne blokowanie odzyskiwania pamięci, jeśli początkowo jest dostępna za mało pamięci.

TryStartNoGCRegion(Int64, Int64)

Próbuje uniemożliwić odzyskiwanie pamięci podczas wykonywania ścieżki krytycznej, jeśli określona ilość pamięci jest dostępna dla dużego sterta obiektu i sterta małego obiektu.

TryStartNoGCRegion(Int64)

Próbuje uniemożliwić odzyskiwanie pamięci podczas wykonywania ścieżki krytycznej, jeśli jest dostępna określona ilość pamięci.

WaitForFullGCApproach()

Zwraca stan zarejestrowanego powiadomienia w celu określenia, czy pełne blokowanie odzyskiwania pamięci przez środowisko uruchomieniowe języka wspólnego jest nieuchronne.

WaitForFullGCApproach(Int32)

Zwraca, w określonym przedziale czasu, stan zarejestrowanego powiadomienia w celu określenia, czy pełne, blokujące odzyskiwanie pamięci przez środowisko uruchomieniowe języka wspólnego jest nieuchronne.

WaitForFullGCApproach(TimeSpan)

Zwraca, w określonym przedziale czasu, stan zarejestrowanego powiadomienia w celu określenia, czy pełne, blokujące odzyskiwanie pamięci przez środowisko uruchomieniowe języka wspólnego jest nieuchronne.

WaitForFullGCComplete()

Zwraca stan zarejestrowanego powiadomienia w celu określenia, czy ukończono pełne blokowanie odzyskiwania pamięci przez środowisko uruchomieniowe języka wspólnego.

WaitForFullGCComplete(Int32)

Zwraca, w określonym przedziale czasu, stan zarejestrowanego powiadomienia w celu określenia, czy pełne, blokujące odzyskiwanie pamięci przez język wspólny zostało ukończone.

WaitForFullGCComplete(TimeSpan)

Zwraca stan zarejestrowanego powiadomienia o tym, czy blokowanie odzyskiwania pamięci zostało ukończone. Może czekać na czas nieokreślony na pełną kolekcję.

WaitForPendingFinalizers()

Zawiesza bieżący wątek, dopóki wątek, który przetwarza kolejkę finalizatorów, opróżnia kolejkę.

Dotyczy

Zobacz też