1、EE是执行引擎,EE拥有对象主要是两种途径:
1)NEW方式
2)静态变量
2、对象可能拥有其它对象,这是树图的开始,CLR以树图为基础进行搜索,记录对象的引用。程序拥有的所有静态变量或者栈上的所有变量为最初的树集。
3、垃圾收集模块决定要开始收集时,调用EE,请求停止所有线程,从而可以检查线程堆栈。
1)EE办理后,栈冻结,垃圾收集器通知EE开始遍历所有的栈和静态变量,然后返回最初的树集。EE中有个遍历模块负责这件事。
2)然后,CLR每次用一个树调用垃圾收集器模块。垃圾收集器收到树后,将遍历生成的静态数据,这些数据告诉我们对象实例的哪个偏移量对应着对其他对象的引用。
3)挨个检查所有的引用位置,对每个位置进行递归检查。当退出递归过程时,树图中由这个根出发能够到达的树都被检查过了,这个根能到达的所有地方都被标记了。
4、具体的工作代码不用递归编写,而是用检查栈的方式。栈空意味着这个根能到达的所有对象均已经到达。
5、检查完并标记完程序能到达的每个对象后,我们能一个个对象地检查内存,如果没有被标记,则是垃圾,特定时候,决定垃圾是否被压缩。
6、完全的垃圾收集操作,我们检查所有的根能到达的所有对象,有办法只收集最近分配的对象,称为第0代收集,同时找到一个办法,保证较老的对象引用了这些新对象可以被我们知道,这些特殊的引用位置有办法很快找到,不用遍历查找所有对象