JVM Garbage Collection Algorithms---转载

转载自布衣寒舍:http://blog.buyihanshe.com/20090709/jvm-gc-algorithms.htm

纵观垃圾收集器的算法思想,不外乎标记(Mark)、清扫(Sweep)、复制(Copy)、压缩(Compact)等几个基本的步骤。通过这篇文章总结一下目前所了解到的GC的一些基本算法。

引用计数(Reference Counting)

每个对象都有一个计数器,记录了指向该对象的引用数目。当创建了一个指向该对象的引用时,该对象的引用计数+1,反之,当该对象的某一个引用销毁时,引用计数-1。当对象的引用计数为0时,回收该对象占用的内存。

但是当存在循环引用时,就会出现漏网之鱼。因为循环引用内的对象的引用计数都不为0,如果从循环外面不可达,那么他们应该也是dead objects。

 

标记(Marking)

标记所有live objects(没标记的就是dead objects),标记过后就可以清扫heap,回收dead objects。

初始化一个root set作为开始标记的集合,root set包含全局变量,当前被调用方法的局部变量和参数等等;

对root set内的每一个对象进行标记。

标记时先检查该对象是否已经标记为live,如果已标记则返回;如果没有标记则标记为live。

然后对该对象所引用的所有对象递归调用上述标记过程。

伪代码如下:

foreach object in rootSet{

mark(object);

}

void mark(obj) {

if(isLive(obj)) {

return;

}

setLive(obj);

foreach object in referencesFrom(obj){

mark(object);

}

}

清扫(Sweep)

遍历堆中的对象,如果标记为live的,则清除标记,否则回收该对象占用的内存。

foreach object in heap{

if(isLive(object)) {

unmark(object);

} else {

free(object);

}

}

三色标记(Tri-colour marking)

三色标记算法分为四步:

1.创建三种集合,表示不同类型的对象集合,分别称为white set,grey set,black set。white set是进行内存回收的候选对象集

合,black set是没有引用white set中对象的对象集合,剩下的对象属于grey set,它们可能引用了white set中的对象,也可能没有引用white set中的对象。

2.从grey set中取出一个对象,将其直接引用的white set中的对象标记为grey(相当于移到了grey set中),将该对象标记为black(相当于移至black set中)。

3.重复2直至grey set为空。

4.当grey set为空时,所有white set中的对象就是不可达的对象,释放其占用的内存空间。

复制(Copying)

复制算法中堆分为old space和new space,对于old space中标记为live的对象,将其复制到new space,并在旧的对象中保存新对象的地址,然后遍历new space中的对象,将该对象中的引用指向其引用对象的新地址。

压缩(Compacting)

压缩算法将所有的live objects移至heap的一端,对于每一个live object,首先计算它在heap中的新地址,再将所有对该对象的引用指向新的地址,然后将该对象移至新的地址。

当然,垃圾收集器也在不断的改进中,这其中会改进现有算法,添加新的算法。

比如压缩算法中,如果在heap的底端附近有很小的dead object,按照简单的压缩算法,就可能会为了达到压缩的目的,而移动后面很多的live object,这样做显然是不值得的。所以,一个改进就是直接跳过。

再比如有些垃圾收集器运行过程中可能会进行多次对象的遍历,这就延长的垃圾收集的时间,所以如果在一两次遍历之中顺便汇总一下以后需要的信息,以避免在后续的处理中再次遍历heap。

在Java SE 6 update 14中引入了一种新的垃圾收集器G1(Garbage First),目前是体验版,据说在Java SE 7中会成为正式成员。

G1的目标是多线程并行收集,和应用程序并发进行,分代的,可压缩的,时间可预测的。

其中并行和并发,压缩都有前辈实现过。分代的实现跟以往不一样,年轻代和年老代不再明确划分,heap被分为很多区域(region),G1动态选择垃圾多的区域作为下次GC的年轻代。对于可预测性,G1会通过预测GC时间来选测适量的区域进行GC,以便达到预期的GC时间设置。

随着时间的推移,技术的进步,算法也在不断的改进,这是一个博大精深的世界,需要一定的时间才能有足够深入的了解,希望上面的些许文字给你些许帮助。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值