在.NET 中的 GC 指的是 CLR 中的自动内存管理器,GC 负责管理 .NET 程序的内存分配和释放。它负责在程序执行过程中自动管理内存,避免了许多常见的内存管理问题。以下是.NET GC的一些关键知识点,有助于.NET开发更深入地理解其工作原理和如何优化应用程序性能,以及可以提高面试的成功率。
1、代的概念
.NET GC将堆内存划分为三代:第0代(新生代)、第1代和第2代。这种代的划分使得垃圾收集可以更加高效地进行,因为大多数对象在短时间内就会变得不可达,而只有少数对象具有较长的生命周期。
第0代:新分配的对象被放置在此代中。垃圾收集频率最高,生命周期短的对象可能在此代被回收。垃圾收集在这一代发生得最频繁。新分配的对象形成了第0代的对象,并且是隐式的第 0 代集合。但是,对象很大,它们将进入大对象堆 (LOH),有时也称为第3 代。第3 代可以理解为物理代,作为第二代的衍生。 大多数对象在第 0 代被回收用于垃圾收集,并且不会存活到下一代。
第1代:经过一定次数的垃圾收集后,仍然存活的对象会被提升到此代。在垃圾收集器执行第 0代的收集后,它会压缩可访问对象的内存并将它们提升到第 1代。因为在收集中幸存下来的对象往往具有更长的生命周期,所以将它们提升到更高的代是有意义的。
第2代:经过更多次的垃圾收集后,仍然存活的对象会被提升到此代。垃圾收集在这里发生的频率较低。长寿命对象的一个示例是服务器应用程序中的对象,其中包含在进程持续期间有效的静态数据。在集合中存活的第 2 代对象将保留在第 2 代中,直到它们被确定在未来的集合中不可访问。 大对象堆(有时称为第3 代)上的对象也在第 2代中收集。
垃圾回收也是进行内存整理的一个过程。