- 垃圾收集器周期性地应用程序不再需要的对象中释放内存。
- 每个应用程序有一组根的集合。一些根的集合指向在托管堆存储位置。每个根指针或者引用托管堆中的一个对象或是被置成空。
- 一个应用程序的一些根的集合由线程栈上的全局静态指针,局部变量和引用对象参数组成。
- JIT编译器和运行时维护应用程序根的集合的列表。垃圾收集器使用这个列表创建从根的集合列表中获得的在托管堆中的对象图表。
- 当垃圾收集器开始运行,它把在托管堆中的所有对象都看作垃圾。
- 垃圾收集器通过应用程序的根的集合列表操作,这个列表定义了在应用程序中一些根的集合列表中有相应的引用的对象并对可获得的对象标记。
- 垃圾收集器也把这样的对象作为可获得对象。(不知道是什么意思)
- 垃圾收集器认为所有托管堆中不可获得的对象是垃圾。
- 垃圾收集器通使用收集进程释放垃圾对象空间。
- 垃圾收集器使用内存复制功能来压缩托管堆中的对象。
- 垃圾收集器更新应用程序根的集合列表中的指针,使得指向较早的应用程序一些根的集合正确指向对象。
- 垃圾收集器使用高度优化的机制完成垃圾收集。它把托管堆中的对象分为三级:0、1、和2。第0级包括最近被创建的对象。
- 垃圾收集器开始在第0级收集不可获得的对象。接着,垃圾收集器紧缩内存并将可获得对象提升为第1级。
- 幸免于收集进程收集的对象被提升为更高的级别。
- 垃圾收集器在第1级和第2级搜索不可获得的对象,仅当通过第0级对象的收集进程释放的内存不足以创建一个新的对象时。
- 垃圾收集器为所有应用程序创建的托管对象管理内存。
- 垃圾收集器能通过在对象等Dispose方法中提供清除代码来显式释放这些系统资源。
- 我们在对象完成工作后需要显式调用Dispose方法。
?实现终止化器
- 终止化器进程允许一个对象在垃圾收集器启动之前完成清理工作。
- Finalize方法确保了即使客户没有显式调用Dispose方法,所使用的资源在对象被垃圾收集时也会从内存被释放。
- 在垃圾收器集进行垃圾收集时识别对象是垃圾后,它在释放内存前调用对象的Finalize方法。
- 终止化器是包含在对象收集之前被执行的清理代码的方法。执行清理代码的进程被叫做终结。Dispose和Finalize方法被叫做终止化器。
- 对象的Dispose方法会释放所有资源,包括它的父对象拥有的资源通过调用父对象的Dispose方法。
- 我们有两个方法执行Dispose方法:
- 类用户能够调将被销毁对象的Dispose方法,或者
- Finalize方法能在终结过程中调用Dispose方法。
以下摘自网友 小新0574 的建议, 谢谢小新0574
2.在“释放内存 ”中提到的“根指针”,这个说法,我个人认为需要斟酌一下。原文是说“a set of roots”,一些根的集合,但把这里的根说成根指针,容易混淆,因为这个根由“global and static object pointers, local variables, and reference object parameters on a thread stack”组成,而这些成员不应该统称为“指针”
3.还有这个词“Finalizers”,<<.NET框架程序设计(修订版)>>的作者是翻译为终止化器,为觉得这个翻译比较好,“完成器”有点不妥,太字面化了,没有说明它的作用。