System.GC 类

方法描述

控制系统垃圾回收器(一种自动回收未使用内存的服务)。

语法定义(C# System.GC 类 的用法)

public static class GC

构造函数

构造函数名称 构造函数描述

成员/方法

方法名称 方法描述
AddMemoryPressure 通知运行时在安排垃圾回收时应考虑分配大量的非托管内存。
CancelFullGCNotification 取消注册垃圾回收通知。
Collect() 强制对所有代进行即时垃圾回收。
Collect(Int32) 强制对零代到指定代进行即时垃圾回收。
Collect(Int32, GCCollectionMode) 强制在 GCCollectionMode 值所指定的时间对零代到指定代进行垃圾回收。
CollectionCount 返回已经对对象的指定代进行的垃圾回收次数。
GetGeneration(Object) 返回指定对象的当前代数。
GetGeneration(WeakReference) 返回指定弱引用的目标的当前代数。
GetTotalMemory 检索当前认为要分配的字节数。 一个参数,指示此方法是否可以等待较短间隔再返回,以便系统回收垃圾和终结对象。
KeepAlive 引用指定对象,使其从当前例程开始到调用此方法的那一刻为止均不符合进行垃圾回收的条件。
RegisterForFullGCNotification 指定当条件支持完整垃圾回收以及回收完成时,应引发垃圾回收通知。
RemoveMemoryPressure 通知运行时已释放非托管内存,在安排垃圾回收时不需要再考虑它。
ReRegisterForFinalize 请求系统调用指定对象的终结器,此前已为该对象调用 SuppressFinalize。
SuppressFinalize 请求系统不要调用指定对象的终结器。
WaitForFullGCApproach() 返回已注册通知的状态,用于确定公共语言运行时是否即将引发完整垃圾回收。
WaitForFullGCApproach(Int32) 在指定的超时期限内,返回已注册通知的状态,用于确定公共语言运行时是否即将引发完整垃圾回收。
WaitForFullGCComplete() 返回已注册通知的状态,用于确定公共语言运行时引发的完整垃圾回收是否已完成。
WaitForFullGCComplete(Int32) 在指定的超时期限内,返回已注册通知的状态,用于确定公共语言运行时引发的完整垃圾回收是否已完成。
WaitForPendingFinalizers 挂起当前线程,直到处理终结器队列的线程清空该队列为止。

提示和注释

此类中的方法影响何时对对象进行垃圾回收以及何时释放对象所分配的资源。 此类中的属性提供以下信息:系统可用内存总量、分配给对象的内存的周期类别(代)。

垃圾回收器跟踪并回收托管内存中分配的对象。 垃圾回收器定期执行垃圾回收以回收分配给没有有效引用的对象的内存。 当使用可用内存不能满足内存请求时,垃圾回收会自动进行。 或者,应用程序可以使用 Collect 方法强制进行垃圾回收。

垃圾回收由以下步骤组成:

垃圾回收器搜索托管代码中引用的托管对象。

垃圾回收器尝试完成没有被引用的对象。

垃圾回收器释放没有被引用的对象并回收它们的内存。

在回收期间,如果垃圾回收器在托管代码中找到对某对象的一个或多个引用,则不会释放该对象。 然而,垃圾回收器不识别非托管代码中对对象的引用,因此,除非明确禁止,否则它有可能释放非托管代码中以独占方式使用的对象。 KeepAlive 方法提供一种机制,该机制可防止垃圾回收器回收在非托管代码中仍使用的对象。

除托管内存分配外,垃圾回收器的实现不维护有关一个对象所保持的资源(如文件句柄或数据库连接)的信息。 当某个类型使用的非托管资源在回收该类型的实例之前必须释放时,该类型可以实现终结器。

多数情况下,终结器通过重写 Object.Finalize 方法来实现,但是,用 C# 或 C++ 编写的类型实现析构函数,由编译器将析构函数转换为对 Object.Finalize 的重写。 多数情况下,如果某对象有终结器,则垃圾回收器会在释放该对象前调用其终结器。 不过,垃圾回收器并不是在所有情况下都需要调用终结器;例如,当 SuppressFinalize 方法显式禁止调用终结器时,垃圾回收器就不需要调用终结器。 此外,不需要垃圾回收器使用特定线程来完成对象,也不需要垃圾回收器为相互引用、但能以其他方式用于垃圾回收的对象保证终结器的调用顺序。

在资源必须在特定时间释放的方案中,类可以实现 IDisposable 接口,该接口包含执行资源管理和清理任务的 IDisposable.Dispose 方法。 实现 Dispose 的类作为它们的类协定的一部分,必须指定类使用者是否需要及在什么时候调用该方法来清理对象。 默认情况下,垃圾回收器并不调用 Dispose 方法,然而 Dispose 方法的实现可以调用 GC 类中的方法来自定义垃圾回收器的完成行为。

建议垃圾回收器使用代来支持对象老化,但这不是必需的。 代是对象在内存中相对存现时期的度量单位。 对象的代数或存在时期指示对象所属的代。 较近创建的对象属于较新的代,比在应用程序生命周期中较早创建的对象的代数低。 最近代中的对象位于零代中。

对实现者的说明

垃圾回收器的此实现支持三代对象。

使用 MaxGeneration 确定系统所支持的最大代数。 对象老化允许应用程序针对一组特定的代进行垃圾回收,而不需要垃圾回收器计算所有代。

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

继承层次结构

System.Object

System.GC

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

线程安全

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。

相关资源

System 命名空间
MSDN