.NET核心 - 垃圾收集

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

  • 您不需要知道如何分配和释放内存或管理使用该内存的对象的生命周期

  • 只要您使用"new"关键字声明对象或将值类型装箱,就会进行分配.分配通常非常快

  • 当没有足够的内存来分配对象时,GC必须收集并处理垃圾内存以使内存可用于新分配.

  • 此过程称为垃圾收集.

垃圾收集的优点

垃圾收集提供以下好处&减去;

  • 开发应用程序时无需手动释放内存.

  • 它还可以有效地在托管堆上分配对象./p>

  • 当不再使用对象时,它会通过清除内存来回收这些对象,并保留可用于将来分配的内存.

  • 托管对象自动获得干净的内容,因此他们的构造函数不必初始化每个数据字段.

  • 它还通过确保tha来提供记忆安全性对象不能使用另一个对象的内容.

垃圾收集条件

垃圾如果满足下列条件之一,则会发生收集.

  • 系统物理内存不足.

  • 托管堆上已分配对象使用的内存超过可接受的阈值.随着流程的运行,此阈值会不断调整.

  • 调用 GC.Collect 方法,几乎在所有情况下都会调用不必调用此方法,因为垃圾收集器不断运行.此方法主要用于独特的情况和测试.

Generations

.NET垃圾收集器有3代,每代都有自己的堆,用于存储已分配的对象.有一个基本原则,即大多数物体要么是短寿命的,要么是长寿命的.

第一代(0)

  • 在第0代中,首先分配对象.

  • 在这一代中,对象通常不会超过第一代生成,因为它们在下一次垃圾收集发生时不再使用(超出范围).

  • 第0代可以快速收集,因为它与堆很小.

第二代(1)

  • 在第1代中,对象有第二个机会空间.

  • 短暂但在第0代集合中存活的对象(通常基于巧合时间)转到第1代.

  • 第1代集合也很快,因为它的相关堆也很小.

  • 前两个堆仍然很小,因为对象被收集或提升到下一个生成器ation heap.

第三代(2)

  • 在第2代中,所有长对象都存在,并且它的堆可以变得非常大.

  • 这一代中的对象可以很长一段时间没有存在,并且没有下一代堆来进一步提升对象.

  • 垃圾收集器有一个额外的堆用于大对象,称为大对象堆( LOH).

  • 它保留给85,000字节或更大的对象.

  • 大型对象未分配给世代堆,但直接分配给LOH

  • 第2代和LOH集合可能需要花费大量时间才能运行的程序很长一段时间或对大量数据进行操作.

  • 众所周知,大型服务器程序的数量为10英镑.

  • GC采用多种技术来减少阻塞程序的时间执行.

  • 主要方法是在后台线程上以不干扰程序执行的方式尽可能多地进行垃圾收集工作.

  • GC还为开发人员提供了一些影响其行为的方法,这对提高性能非常有用.