本文提供了此 API 参考文档的补充说明。
该 GC 类控制垃圾回收器。 垃圾回收器是一个公共语言运行时组件,用于控制托管内存的分配和释放。 此类中的方法会影响对象何时进行垃圾回收以及何时释放由对象分配的资源。 此类中的属性提供有关系统可用内存总量以及分配给对象的内存的年龄类别或生成的信息。
垃圾回收器跟踪和回收托管内存中分配的对象。 垃圾回收器定期执行垃圾回收,以回收那些没有有效引用的对象所占用的内存。 当无法使用可用可用内存满足对内存的请求时,垃圾回收会自动进行。 或者,应用程序可以使用该方法 Collect 强制垃圾回收。
垃圾回收由以下步骤组成:
- 垃圾回收器搜索托管代码中引用的托管对象。
- 垃圾回收器尝试完成未引用的对象。
- 垃圾回收器释放未被引用的对象并回收它们的内存。
非托管资源
在回收期间,如果垃圾回收器在托管代码中找到对对象的一个或多个引用,则垃圾回收器将不会释放对象。 但是,垃圾回收器无法识别对非托管代码中对象的引用,并且可能会释放在非托管代码中独占使用的对象,除非明确阻止这样做。 该方法 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 成功。