.NET Core – 垃圾收集
.NET Core – 垃圾收集
在本章中,我们将介绍垃圾收集的概念,它是 .NET 托管代码平台最重要的特性之一。垃圾收集器 (GC) 管理内存的分配和释放。垃圾收集器充当自动内存管理器。
-
您不需要知道如何分配和释放内存或管理使用该内存的对象的生命周期
-
每当您使用“new”关键字声明对象或值类型被装箱时,就会进行分配。分配通常非常快
-
当没有足够的内存来分配对象时,GC 必须收集和处理垃圾内存,以使内存可用于新的分配。
-
此过程称为垃圾收集。
垃圾回收的优势
垃圾收集提供以下好处 –
-
您无需在开发应用程序时手动释放内存。
-
它还有效地在托管堆上分配对象。
-
当不再使用对象时,它将通过清除它们的内存来回收这些对象,并保持内存可用于将来的分配。
-
托管对象会自动获得干净的内容,因此它们的构造函数不必初始化每个数据字段。
-
它还通过确保一个对象不能使用另一个对象的内容来提供内存安全。
垃圾收集条件
当以下条件之一为真时,会发生垃圾收集。
-
系统物理内存不足。
-
托管堆上已分配对象使用的内存超过了可接受的阈值。该阈值会随着过程运行而不断调整。
-
该GC.Collect的方法被调用,并在几乎所有情况下,你不必调用此方法,因为垃圾收集器连续运行。此方法主要用于特殊情况和测试。
几代人
.NET 垃圾收集器有 3 代,每一代都有自己的堆,用于存储分配的对象。有一个基本原则,即大多数对象要么是短期的,要么是长期存在的。
第一代 (0)
-
在第 0 代中,首先分配对象。
-
在这一代中,对象通常不会超过第一代,因为在下一次垃圾回收发生时它们不再被使用(超出范围)。
-
第 0 代收集起来很快,因为它关联的堆很小。
第二代 (1)
-
在第 1 代中,对象有第二次机会空间。
-
生命周期很短但在第 0 代集合(通常基于巧合的时间)中幸存下来的对象进入第 1 代。
-
第 1 代收集也很快,因为其关联的堆也很小。
-
前两个堆仍然很小,因为对象要么被收集,要么被提升到下一代堆。
第三代 (2)
-
在第 2 代中,所有长对象都存在并且其堆可以增长到非常大。
-
这一代的对象可以存活很长时间,没有下一代堆来进一步提升对象。
-
垃圾收集器有一个额外的大对象堆,称为大对象堆 (LOH)。
-
它是为 85,000 字节或更大的对象保留的。
-
大对象不分配给分代堆,而是直接分配给 LOH
-
对于已运行很长时间或处理大量数据的程序,第 2 代和 LOH 集合可能需要花费大量时间。
-
众所周知,大型服务器程序有 10 多 GB 的堆。
-
GC 使用多种技术来减少它阻止程序执行的时间。
-
主要方法是以不干扰程序执行的方式在后台线程上执行尽可能多的垃圾收集工作。
-
GC 还为开发人员提供了一些影响其行为的方法,这对于提高性能非常有用。