垃圾回收器的原理

  垃圾回收器(Garbage Collector)是CLR 里的一个功能,所以它只能处理CLR所管辖范围内的代码内存(即托管内存)

  垃圾回收期会检查托管堆中是否有应用程序不再使用的任何对象。如果有,他们的内存就可以回收。

  原理:

    JIT编译器生成本地代码时,还会创建一个内部使用的表。从逻辑上来讲,该表中的每个记录项都代表在方法的本地CPU指令中的一个字节偏移范围,针对每个范围,这个记录项都记录了包含着根的一组内存地址和CPU寄存器。(这个记录项的每个内存地址和CPU寄存器即是根,根只是抽象的说法)

   一、 垃圾回收器开始执行时,它假设堆中的所有对象都是垃圾。垃圾回收器沿着线程栈上行以检查所有根(然后遍历所有类型对象上的所有根),如果发现一个根引用了一个对象,就在对象的“同步块索引字段”上开启一个位(对象就是这样标记的),如果对象里又引用有其他对象,则会遍历所有对象以标识。检查好所有根之后,堆中将包含一组已标记和未标记的对象。不可达的对象所占的内存可以回收。

  二、垃圾回收器线性遍历堆,以寻找未标记对象的连续内存。如果发现的内存块比较小,垃圾回收器会忽略它们。但是,如果发现大的、可用的连续内存块,《垃圾回收器会把非垃圾的对象移动到这里以压缩堆》。注:碎片整理的工作,第一次把0代残留对象都压入1代托管堆,0代全部清空!

       很自然,移动内存中的对象之后,包含“指向这些对象的指针”的变量和CPU寄存器现在都变得无效。所以,垃圾回收器必须重新访问应用程序的根,并修改他们来指向队形的新内存地址。(另外,如果对象中的字段指向的是另一个已移动了位置的对象,垃圾回收器也要负责改正这些字段。)堆内存压缩之后,托管堆的NextObjPtr 指针将指向紧接在最后一个非垃圾对象之后的位置。

      我感觉GC耗费性能主要在第二阶段,第一阶段只不过是一个遍历标记,没啥复杂度,瞬间会结束,而第二阶段则会压缩标记对象,清空未标记对象,更主要的是对应根的内存地址和CPU寄存器要相应的改变,这是比第一阶段要复杂多的算法!

转载于:https://www.cnblogs.com/zche/archive/2012/09/17/2688444.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值