Dotnet Core 简明教程

.NET Core - Garbage Collection

在本章中,我们将介绍垃圾回收的概念,它是 .NET 托管代码平台最重要的特性之一。垃圾回收器 (GC) 管理着内存的分配和释放。垃圾回收器充当自动内存管理器。

  1. 你无需了解如何分配和释放内存或管理使用该内存的对象的生命周期

  2. 在使用“new”关键字声明对象或对值类型进行装箱时,将进行分配。分配通常非常快。

  3. 当没有足够的内存来分配一个对象时,GC 必须回收和处置垃圾内存,以便为新的分配提供内存。

  4. 此过程称为 garbage collection

Advantages of Garbage Collection

垃圾回收提供了以下好处:

  1. 在开发应用程序时,你无需手动释放内存。

  2. 它还高效地在托管堆上分配对象。

  3. 当对象不再使用时,它将回收那些对象,清除它们的内存,并让内存供以后分配使用。

  4. 受管对象自动获取干净内容以开始执行,因此它们的构造函数不必初始化每个数据字段。

  5. 它还通过确保对象无法使用另一个对象的内容实现内存安全。

Conditions for Garbage Collection

如果下列条件之一为真,则发生垃圾回收。

  1. 系统物理内存较低。

  2. 受管堆上已分配对象使用的内存超过了可接受的阈值。在进程运行过程中,该阈值会不断地进行调整。

  3. 调用的 GC.Collect 方法,而且在几乎所有情况下,你都无需调用该方法,因为垃圾回收程序会不断运行。此方法主要用于特殊情况和测试中。

Generations

Generation First (0)

NET 垃圾回收程序分 3 代且每代都有自己的堆,用于存储已分配的对象。一个基本原则是,大多数对象都是短期的或长时间的。
  1. 在第 0 代中,首先分配对象。

  2. 在这一代中,由于在下次垃圾回收发生时不再使用对象(超出范围),因此对象常常不会存活超过第一代。

  3. 由于其关联堆较小,因此第 0 代可快速进行回收。

Generation Second (1)

  1. 在第 1 代中,对象享有第二次机会。

  2. 存活期较短,但是又能够经历第 0 代回收的对象(常常与巧合的时间点有关),会进入第 1 代。

  3. 第 1 代的回收也较快,因为其关联堆同样较小。

  4. 前两个堆保持较小,其原因是对象会受到回收或被提升到下一代堆。

Generation Third (2)

  1. 在第 2 代中,所有长寿命对象都会存活,并且其堆会增长得很大。

  2. 这一代中的对象会存活很长时间,而且没有下一代堆可以进一步提升对象。

  3. 垃圾回收程序拥有一个用于大型对象的其他堆,称为大型对象堆 (LOH)。

  4. 该堆专门针对大小为 85,000 字节或更大的对象而保留。

  5. 不会将大型对象分配到代堆,而是直接分配到 LOH 中

  6. 对于长期运行或对大量数据进行操作的程序,生成 2 和 LOH 集合可能需要显着的时间。

  7. 众所周知,大型服务器程序的堆内存有几十 GB。

  8. 垃圾回收器采用了多种技术来减少其阻止程序执行的时间量。

  9. 主要方法是在后台线程上尽可能多地执行垃圾回收工作,而不会干扰程序执行。

  10. 垃圾回收器还暴露出一些方式供开发人员影响其行为,这对于提高性能非常有用。