[学习笔记]垃圾回收算法(一)


本文参考 垃圾回收的算法与实现

本篇目前说的是分代垃圾回收算法

基于编程经验,很多对象在在生成后不久就成了垃圾,因此引入了年龄的概念,经过一次GC,年龄加一。

新生代与老年代

分代垃圾回收算法将对象根据年龄分为新生代与老年代。新生代的GC称为minor GC,新生代对象存活一定的次数后上升为老年代对象成为晋升(promotion)。老年代的GC频率较低,成为major GC。

分代垃圾回收算法是与复制算法、清除算法和压缩算法结合使用的。

Ungar的分代垃圾回收算法

David Ungar 研究出来把 GC 复制算法和分代垃圾回收这两
者组合运用的方法。

该方法中,堆的结构分为四个空间,是生成空间、2 个大小相等的幸存空间以及老年代空间。生成空间与幸存空间合称为新生代空间。

生成空间:生成对象的空间,该空间满时,触发minor GC。将所有活动对象复制到幸存空间。

幸存空间:两个幸存空间与复制算法中的from和to空间类似。只利用其中一个,正在使用的幸存空间叫from空间,另一个未使用的叫to空间。minor GC时将from空间和生成空间的活动对象复制到to空间。

minor GC:minor GC中需要注意老年代空间到新生代空间的引用,因此除了一般GC里的根,老年代对象也需被当作根来处理。但这样一来,分代收集的优势就很小了,因为还是需要遍历所有对象。

记录集:因此使用数组——记录集,记录老年代对象到新生代对象的引用,minor GC时只需搜索记录集即可。

记录集中记录的是发出引用的对象,也就是老年代对象引用。为了将其写入到记录集中,需要利用写入屏障

//obj 是发出引用的对象,obj 内存在要更新的指针
//field 指的就是 obj 内的域
//new_obj 是在指针更新后成为引用目标的对象。
write_barrier(obj, field, new_obj){
	//发出引用的对象是不是老年代对象;指针更新后的引用的目标对象是不是新生代对象;发出引用的对象是否还没有被记录到记录集中
 	 if(obj >= $old_start && new_obj < $old_start && obj.remembered == FALSE)
 	 //$rs_index 是用于新记录对象的索引。
 	 $rs[$rs_index] = obj
 	 $rs_index++
 	 obj.remembered = TRUE
 	 *field = new_obj
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值