2009-07-22 103 views

回答

2

GC仅在堆满时发生。 当垃圾收集器启动 运行时,它会假定堆中的所有对象都是垃圾。 换句话说,它假设应用程序的根没有任何 指向堆中的任何对象 。现在, 垃圾收集器开始步行 根,并构建从根到达的所有对象的图形。例如,对于 示例,垃圾收集器可能会在 中找到一个全局变量,该变量指向堆中对象的 。

下图显示了几个 分配的对象,其中 应用根1直接引用 对象OBJ1,OBJ2和应用 根2指OBJ4和obj5堆。这些对象全部为 图的一部分。当添加对象Obj2的 应用程序根目录1时,收集程序 注意到此对象指的是 对象Obj7也被添加到 图中。收集器继续通过所有可到达对象 递归地步行 。

alt text http://www.c-sharpcorner.com/UploadFile/ankithakur/GCAlgorithm12222005224854PM/Images/GC.gif

...续here

这里有一对夫妇的其他链接,让你在垃圾收集阅读:

1

这是GC的基本思路。

==========================================

每个应用程序都有一组根。根标识存储位置,这些存储位置引用托管堆上的对象或设置为空的对象。

例如:

- 应用程序中的所有全局和静态对象指针。 - 线程堆栈上的任何本地变量/参数对象指针。 - 包含指向托管堆中对象的指针的任何CPU寄存器。 - 指针从Freachable队列

积极根的名单是由刚刚在时间(JIT)编译器和公共语言运行库维护,由垃圾回收算法访问的对象