GC 類別

定義

控制系統垃圾回收器,一種自動回收未使用的記憶體的服務。

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
繼承
GC

範例

以下範例使用多種 GC 方法,取得一組未使用物件區塊的生成與記憶體資訊,並將其列印到主控台。 未使用的物件會被收集,並顯示產生的記憶體總數。

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

備註

類別 GC 會控制垃圾收集器。 垃圾回收器是通用語言執行環境的元件,負責控制受管理的記憶體的配置和釋放。 這個類別的方法會影響物件進行垃圾回收的時間,以及釋放物件已配置的資源的時間。 此類別中的屬性提供有關系統可用記憶體總量以及分配給物件的記憶體年齡類別或代的資訊。

垃圾收集器會追蹤並回收在受控記憶體中配置的物件。 垃圾回收器會定期執行垃圾回收,以釋放那些沒有有效參考的物件所占用的記憶體。 當無法使用可用的可用記憶體滿足記憶體要求時,會自動進行垃圾收集。 或者,應用程式可以使用Collect 方法來強制垃圾回收。

垃圾收集包含下列步驟:

  1. 垃圾收集器會搜尋受控程式碼中所參考的受控物件。
  2. 垃圾收集器會嘗試清理未參考的物件。
  3. 垃圾收集行程會釋放目前未被參考的物件,並回收其記憶體。

非受控資源

在收集期間,如果垃圾收集器在受管理程式碼中找到一個或多個物件的引用,就不會釋放該物件。 不過,垃圾收集器無法識別來自非受控程式碼的對象引用,除非明確阻止這樣做,否則可能會釋放在非受控程式碼中專門使用的物件。 KeepAlive方法提供機制,可防止垃圾收集器收集非受控代碼中仍在使用的物件。

除了受管理的記憶體配置之外,垃圾收集器的實作不會維護物件持有的資源資訊,例如檔案控制代碼或資料庫連接。 當一個類型使用必須在該類型的實例被回收之前釋放的非受控資源時,該類型可以實作一個終結器。

在大部分情況下,完成項是透過覆寫Object.Finalize方法來實作;不過,以 C# 或 C++撰寫的類型會實作解構函式,編譯器會將它轉換成覆寫Object.Finalize。 在大部分情況下,如果物件有終結器,垃圾收集器會在釋放物件之前呼叫它。 不過,在所有情況下,垃圾回收器並不需要呼叫終結器;例如,SuppressFinalize 方法會明確防止呼叫物件的終結器。 此外,垃圾收集器不要求使用特定線程來對物件進行終結,或保證終結彼此參考但可供垃圾收集的物件的順序。

在特定時間必須釋放資源的情況下,類別可以實作 IDisposable 介面,其中包含 IDisposable.Dispose 方法,用於執行資源管理和清除工作。 實作Dispose的類別必須在其類別合約中明訂取用者在何時及何種情況下呼叫方法來清理物件。 根據預設,垃圾收集行程不會呼叫 Dispose 方法;不過,方法的 Dispose 實作可以呼叫 類別中的 GC 方法,以自定義垃圾收集行程的最終化行為。

如需對象最終化和處置模式的詳細資訊,請參閱 清除 Unmanaged 資源

物件老化和世代

通用語言運行環境中的垃圾回收程序支援使用世代來管理物件的年齡。 世代是記憶體中對象相對年齡的測量單位。 物件的世代號碼或存留期表示對象所屬的世代。 最近建立的物件是較新世代的一部分,且世代數目比應用程式生命週期稍早建立的對象還要少。 最近一代中的對象位於層代 0 中。 這個垃圾收集器的實作支援三個物件世代,分別是第 0 代、第 1 代和第 2 代。 您可以擷取 屬性的值 MaxGeneration ,以判斷系統所支援的最大世代數目。

物件老化允許應用程式針對特定的一組代次進行垃圾收集,而不需要垃圾收集器評估所有代次。 Collect方法的多載,其中包含generation參數,允許您指定要進行垃圾收集的最舊世代。

不允許垃圾收集

垃圾收集器支援無 GC 區域延遲模式,可在執行關鍵路徑期間,垃圾收集可能對應用程式效能造成負面影響時使用。 無 GC 區域延遲模式需要您指定一個記憶體數量,以便不受垃圾收集器的干擾進行配置。 如果執行時環境可以配置該記憶體,那麼在執行關鍵路徑中的程式碼時,執行時環境將不會進行垃圾收集。

您可以藉由呼叫TryStartNoGCRegion的其中一個多載來定義無 GC 區域的關鍵路徑之開頭。 您可以藉由呼叫 EndNoGCRegion 方法來指定其重要路徑的結尾。

您無法巢狀呼叫 TryStartNoGCRegion 方法,而且只有在運行時間目前沒有 GC 區域延遲模式時,才應該呼叫 EndNoGCRegion 方法。 換句話說,您不應該多次呼叫 TryStartNoGCRegion (在第一個方法呼叫之後,後續呼叫不會成功),而且您不應該預期呼叫 EndNoGCRegion 成功,只是因為第一次呼叫 TryStartNoGCRegion 成功。

屬性

名稱 Description
MaxGeneration

取得系統目前支援的最大世代數。

方法

名稱 Description
AddMemoryPressure(Int64)

在執行時通知大量未管理記憶體的配置,這些配置在排程垃圾回收時應予以考慮。

AllocateArray<T>(Int32, Boolean)

分配一個陣列。

AllocateUninitializedArray<T>(Int32, Boolean)

配置陣列時,如果可能的話跳過零初始化。

CancelFullGCNotification()

取消垃圾收集通知的註冊。

Collect()

強制立即進行各代垃圾回收。

Collect(Int32, GCCollectionMode, Boolean, Boolean)

強制垃圾回收從第 0 代到指定世代,時間由一個 GCCollectionMode 值指定,該值指定集合是否應阻塞與壓縮。

Collect(Int32, GCCollectionMode, Boolean)

強制垃圾回收從第 0 代到指定世代,並在由一個 GCCollectionMode 值指定的時間點執行,該值指定該集合是否應該阻塞。

Collect(Int32, GCCollectionMode)

強制從第 0 代到指定世代,並在由值 GCCollectionMode 指定的時間內進行垃圾回收。

Collect(Int32)

強制從第 0 代到指定世代立即進行垃圾回收。

CollectionCount(Int32)

回傳指定產生物件時發生的垃圾回收次數。

EndNoGCRegion()

結束了無 GC 區域延遲模式。

GetAllocatedBytesForCurrentThread()

取得自執行緒生命週期開始以來分配給該執行緒的總位元組數。

GetConfigurationVariables()

取得垃圾回收器使用的配置。

GetGCMemoryInfo()

取得垃圾回收記憶體資訊。

GetGCMemoryInfo(GCKind)

取得垃圾回收記憶體資訊。

GetGeneration(Object)

回傳指定物件的當前世代數。

GetGeneration(WeakReference)

回傳指定弱參考目標的當前世代數。

GetTotalAllocatedBytes(Boolean)

計算程序生命週期內分配的位元組數量。 傳回的值不包含任何原生配置。

GetTotalMemory(Boolean)

擷取堆積大小(不含碎片)。 例如,如果 GC 堆積總大小為 100mb,而碎片(也就是空置物件佔用的空間)佔用 40mb,這個 API 會回報 60mb。 一個參數表示此方法是否能在返回前等待短時間,以便系統收集垃圾並完成物件。

GetTotalPauseDuration()

會取得自流程開始以來,GC 中暫停的總時間。

KeepAlive(Object)

引用指定的物件,使其從目前例程開始到此方法被呼叫時,無法進行垃圾回收。

RefreshMemoryLimit()

指示垃圾回收器透過偵測系統上的各種記憶體限制來重新配置自己。

RegisterForFullGCNotification(Int32, Int32)

規定當條件支持全面垃圾收集且收集完成時,應提出垃圾收集通知。

RegisterNoGCRegionCallback(Int64, Action)

註冊一個回調,當在無 GC 區域分配到一定數量的記憶體時,會被呼叫。

RemoveMemoryPressure(Int64)

通知執行時未管理記憶體已被釋放,且在排程垃圾回收時不再需要考慮。

ReRegisterForFinalize(Object)

請求系統呼叫先前已呼叫的指定物件 SuppressFinalize(Object) 的終結器。

SuppressFinalize(Object)

請求公共語言執行時不要呼叫指定物件的終結子。

TryStartNoGCRegion(Int64, Boolean)

嘗試在執行關鍵路徑時,若記憶體容量達到指定,則禁止垃圾回收,並控制若初始記憶體不足,垃圾回收器是否會進行完整的阻塞式垃圾回收。

TryStartNoGCRegion(Int64, Int64, Boolean)

嘗試在執行關鍵路徑時,若大物件堆與小物件堆皆有指定記憶體容量,則禁止垃圾回收;並控制垃圾回收器在初始記憶體不足時是否進行完整的區塊垃圾回收。

TryStartNoGCRegion(Int64, Int64)

嘗試在執行關鍵路徑時,若大物件堆與小物件堆均有指定記憶體容量,則禁止垃圾回收。

TryStartNoGCRegion(Int64)

嘗試在執行關鍵路徑時,若有指定記憶體量,則禁止垃圾回收。

WaitForFullGCApproach()

回傳註冊通知狀態,用以判斷公共語言執行時是否即將發生完整的阻塞性垃圾回收。

WaitForFullGCApproach(Int32)

在指定的逾時期內,回傳已註冊通知的狀態,用以判斷公共語言執行時是否即將出現完整的阻塞性垃圾回收。

WaitForFullGCApproach(TimeSpan)

在指定的逾時期內,回傳已註冊通知的狀態,用以判斷公共語言執行時是否即將出現完整的阻塞性垃圾回收。

WaitForFullGCComplete()

回傳註冊通知狀態,用以判斷公共語言執行時是否完成了完整的阻塞性垃圾回收。

WaitForFullGCComplete(Int32)

在指定的逾時期內,回傳一個註冊通知的狀態,用以判斷執行時是否完成了一個完整的、以共同語言進行的阻塞性垃圾回收。

WaitForFullGCComplete(TimeSpan)

回傳已註冊通知狀態,告知阻塞性垃圾回收是否完成。 可能會無限期等待完整收藏。

WaitForPendingFinalizers()

暫停目前執行緒,直到處理終結者佇列的執行緒清空該佇列。

適用於

另請參閱