System.GC 类

本文提供了此 API 参考文档的补充说明。

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 ,以确定系统支持的最大代数。

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

禁止垃圾回收

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

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

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