文章目录
前言
C#的垃圾回收网上有很多博客进行讲解,这里摘录一部分较好的讲解,同时建议直接使用微软官方文档,万变不离其宗一、垃圾回收是什么
.NET 的垃圾收集器管理应用程序的内存分配和释放。每次创建新对象时,公共语言运行时都会从托管堆中为该对象分配内存。只要托管堆中有可用的地址空间,运行时就会继续为新对象分配空间。然而,内存并不是无限的。最终垃圾收集器必须执行收集以释放一些内存。垃圾收集器的优化引擎根据进行的分配确定执行收集的最佳时间。当垃圾收集器执行收集时,它会检查托管堆中应用程序不再使用的对象,并执行必要的操作来回收它们的内存。
在公共语言运行时 (CLR) 中,垃圾收集器 (GC) 充当自动内存管理器。垃圾收集器管理应用程序的内存分配和释放。对于使用托管代码的开发人员来说,这意味着不必编写代码来执行内存管理任务。自动内存管理可以消除常见问题,例如忘记释放对象并导致内存泄漏或尝试访问已释放对象的内存。
Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象[2],通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理。为了实现这个原理,GC有多种算法。比较常见的算法有Reference Counting,Mark Sweep,Copy Collection等等。目前主流的虚拟系统.NET CLR,Java VM和Rotor都是采用的Mark Sweep算法。
二、好处
垃圾收集器提供以下好处:
- 使开发人员不必手动释放内存。
- 有效地在托管堆上分配对象。
- 回收不再使用的对象,清除它们的内存,并使内存可用于将来的分配。托管对象会自动获得干净的内容,因此它们的构造函数不必初始化个数据字段。
- 通过确保一个对象不能为自己使用分配给另一个对象的内存来提供内存安全。
总的说来就是GC可以使程序员可以从复杂的内存问题中摆脱出来,从而提高了软件开发的速度、质量和安全性。
三、GC过程
1.GC条件
- If the system has low physical memory, then garbage collection is necessary.(系统内存过低时执行)
- If the memory allocated to various objects in the heap memory exceeds a pre-set threshold, then garbage collection occurs.(分配给各个对象的内存超过预先设定阈值)
- If the GC.Collect method is called, then garbage collection occurs. However, this method is only called under unusual situations as normally garbage collector runs automatically.(手动调用GC.Collect)
2.GC步骤
GC总体可以分为三个步骤:
- 标记(Mark)。从Root开始进行引用标记,未被标记到的为不可达内存,不可达内存为GC对象。
- 重新分配地址(Relocate)。更新所有活动对象列表中的所有对象的引用,以便它们指向对象将