正在阅读:.NET中的垃圾回收(上).NET中的垃圾回收(上)

2004-02-14 09:34 出处:PConline 作者:cloud/CSDN 责任编辑:linjixiong

   比如:

  一个应用程序中所有全局和静态对象指针。

  一个线程堆栈中所有局部变量/参数对象指针。

  托管堆中所有CPU登记的对象指针。

   FReachable队列中的对象指针。

  活动根的表由JIT编译器和CLR维护,并且对于垃圾回收器的算法是访问。

  实现
  .NET中的垃圾回收是用跟踪回收实现的,确切的说CLR实现了标记(Mark)/整理(Copact)回收器。

  这个方法有以下两个阶段组成:

   阶段I:标记(Mark)

  找到可以被收回的内存。

   当GC开始运行时,它假设堆中的所有对象都是垃圾。换句话说,它假设应用程序的根没有指向堆中的的任何对象。

  阶段I中包含下列步骤:

  1.  GC识别存活对象的引用或应用程序根。

  2.  从根开始遍历,建一张可以从根遍历的所有对象的图。

  3.  如果GC准备尝试添加一个已经在图中的对象,它就停止这条路径的遍历。这样做有两个目的,第一个是极大的优化性能,因为它不会遍历一套对象一次以上。第二是防止当有对象的循环连接列表时而发生死循环,因此循环被有效的控制了。

   一旦所有的根都被检查完后,垃圾回收器的图中包含了所有可以从应用程序根遍历到的对象。任何不再图中的对象都不能被应用程序访问到,也就是所谓的垃圾。

   阶段II:整理(Compact)
  把所有存活的对象移到堆的末端,空出堆顶端的空间。

   阶段II包含下列步骤:

  1.  现在GC线性地遍历堆,寻找邻近的垃圾对象块(现在被认为是空闲空间)。

  2.  然后GC往下移动内存中的非垃圾对象,去掉堆中的所有空隙。

  3.  移动内存中的对象导致对象指针失效。因此GC需要修改应用程序的根使对象的指针指向新的位置。

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品