比如: 一个应用程序中所有全局和静态对象指针。 一个线程堆栈中所有局部变量/参数对象指针。 托管堆中所有CPU登记的对象指针。 FReachable队列中的对象指针。 活动根的表由JIT编译器和CLR维护,并且对于垃圾回收器的算法是访问。 实现 这个方法有以下两个阶段组成: 阶段I:标记(Mark) 当GC开始运行时,它假设堆中的所有对象都是垃圾。换句话说,它假设应用程序的根没有指向堆中的的任何对象。 阶段I中包含下列步骤: 1. GC识别存活对象的引用或应用程序根。 2. 从根开始遍历,建一张可以从根遍历的所有对象的图。 3. 如果GC准备尝试添加一个已经在图中的对象,它就停止这条路径的遍历。这样做有两个目的,第一个是极大的优化性能,因为它不会遍历一套对象一次以上。第二是防止当有对象的循环连接列表时而发生死循环,因此循环被有效的控制了。 一旦所有的根都被检查完后,垃圾回收器的图中包含了所有可以从应用程序根遍历到的对象。任何不再图中的对象都不能被应用程序访问到,也就是所谓的垃圾。 阶段II:整理(Compact) 阶段II包含下列步骤: 1. 现在GC线性地遍历堆,寻找邻近的垃圾对象块(现在被认为是空闲空间)。 2. 然后GC往下移动内存中的非垃圾对象,去掉堆中的所有空隙。 3. 移动内存中的对象导致对象指针失效。因此GC需要修改应用程序的根使对象的指针指向新的位置。
|
正在阅读:.NET中的垃圾回收(上).NET中的垃圾回收(上)
2004-02-14 09:34
出处:PConline
责任编辑:linjixiong
键盘也能翻页,试试“← →”键