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 方法来自定义垃圾回收器的最终化行为。

有关对象最终化和释放模式的详细信息,请参阅 清理非托管资源

对象老化和代系

公共语言运行时中的垃圾回收器支持对象随着代系变化而老化。 生成是内存中对象的相对年龄的度量单位。 对象的生成号或年龄指示对象所属的代系。 更近期创建的对象属于较新的一代,其代系低于在应用程序生命周期早期创建的对象。 最近一代的对象位于第 0 代中。 垃圾回收器的此实现支持三代对象(第 0 代、1 代和 2 代)。 可以检索 MaxGeneration 属性的值,以确定系统支持的最大代数。

对象老化使应用程序能够将垃圾回收目标定位于特定代系,而不需要垃圾回收器评估所有代系。 包含 Collect 参数的 generation 方法的重载允许指定要垃圾回收的最旧一代。

禁止垃圾回收

垃圾回收器支持一种无 GC 区域的延迟模式,可以在执行可能因垃圾回收对应用性能产生不利影响的关键路径时使用。 无 GC 区域延迟模式要求指定可以分配的内存量,而不会受到垃圾回收器的干扰。 如果运行时可以分配该内存,则在执行关键路径中的代码时,运行时不会执行垃圾回收。

可以通过调用 TryStartNoGCRegion 的重载之一来定义无 GC 区域的关键路径的开始。 通过调用 EndNoGCRegion 方法指定其关键路径的末尾。

不能嵌套调用TryStartNoGCRegion方法,并且仅当运行时当前处于无GC区域延迟模式时,才应调用EndNoGCRegion方法。 换句话说,不应多次调用 TryStartNoGCRegion (在第一次方法调用后,后续调用不会成功),并且不应期望调用 EndNoGCRegion 成功,只是因为第一次调用 TryStartNoGCRegion 成功。

属性

名称 说明
MaxGeneration

获取系统当前支持的最大代数。

方法

名称 说明
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()

挂起当前线程,直到正在处理终结器的队列的线程已清空该队列。

适用于

另请参阅