虚拟机垃圾收集算法

1.标记-清除算法


最基础的收集算法是 “标记-清除”。如同名字一样。算法分为标记和清除2个阶段。首先标记出所有需要回收的对象。标记完成后统一回收所有被标记的对象。

但是此种算法有2个不足之处:

 1) 效率问题。2个过程效率都不高

2)空间碎片问题。标记清除之后会产生大量的空间碎片。这样后期的程序中。可能无法为大对象分配连续的空间,而导致另一次GC操作


a



复制算法

为了解决效率问题。出现了一种“复制算法” 。它把内存按照容量分为2块。 每次只使用一块。当使用的这块分配完了。就把还存活的对象复制到另外一块中。然后把已使用的做一次清理。这样就可以每次只针对半块清理。内存分配不用考虑空间碎片。但是这样有效内存却只有一半。

现在商业虚拟机基本都采用复制算法。但是一比一的分法太过于浪费空间。实际情况更多的对象都是 “朝生暮死”的。

大部分都是把内存分为大的eden区和2个小的survior空间。hotspot默认把eden和survior按照8:1的分法。这样只有百分之10的内存浪费。

实际情况中,我们不可能保证每次都是只有百分之10以下的对象存活。那么当超过百分之10又该怎么办呢?

其实就是依赖别的分区(老年区)。


3标记-整理算法

复制收集算法在对象存活率高的时候,效率将会变低。更关键的是,如果你不想浪费空间。所以老年代就没有采用这个算法

根据老年代的特点。有人推出 “标记-整理”算法

标记的过程和“标记-清除”一样。但后续步骤不是对可回收对象进行清理。而且让所有存活的对象都向一端移动。然后直接清理掉端界以外的内存



4分代收集算法

当前虚拟机垃圾回收都采用了 “分代收集”。

根据对象存活的周期划分为几块不同的区域。一般是把java堆分为新生代和老年代。这样就可以根据各个年代的特点采用不用的收集算法。在新生代中大多对象都是很快死亡,于是采用复制算法。在老年代与其相反就采用“标记-整理”或者“标记-清除”算法。


















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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值