垃圾收集算法

PS:文章来源《深入理解java虚拟机第三版 3.3垃圾收集算法》

1.分代收集理论

①弱分代假说:绝大多数对象都是朝生夕灭的(划分为新生代)。

②强分代假说:熬过越多次垃圾收集过程的对象就越难消亡(划分为老年代)。

③跨代引用假说:跨代引用相对于同代引用来说相对较少(例:某个新生代存在跨代引用,由于老年代对象难以消亡,新生代对象对象在多次垃圾回收过程中得以存活,继而也晋升到老年代,此时跨代引用也就消除了)。

2.标记-清除算法

首先需要标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。该算法有两个缺点:①执行效率不稳定,当java堆中存在大量对象需要回收时,需要进行大量标记和清除动作,执行效率随回收对象的增加而降低;②内存空间碎片化问题,内存空间碎片太多可能无法分配较大的对象导致不得不提前触发另一次垃圾回收动作。

3.标记-复制算法

“半区复制”垃圾回收算法,将内存分为两大块,一块用完了就将还存活的对象进行标记复制到另一块上,再把使用过的内存空间一次清理掉。该收集算法避免了标记清除算法产生的内存碎片化问题,且分配内存只需要移动堆顶指针,按顺序分配即可,这样实现简单,运行高效。当然也有缺点:①当有大量对象都是存活的,那也会产生大量的内存复制开销;②将可用内存缩小为原来的一半太浪费内存空间。

目前该算法都用于回收新生代这样朝生熄灭的对象,且采用了更优化的半区复制分代策略,即把新生代分为一块较大的Eden空间和两块较小的Servivor空间,每次内存分配只使用Eden和其中一块Servivor,发生垃圾回收时,将这两块存活的对象复制到了另一个Servivor中,再清理掉这两块空间。Eden和Servivor默认大小比例是8:1。当然若Servivor空间不足以容纳一次Minor GC(年轻代GC)后存活的对象,就需要依赖其他区域(实际上大多数指老年代)进行分配担保。

4.标记-整理算法

当存活对象过多时,标记复制算法效率就会降低,且需要有额外空间进行分配担保,因此老年代一般不选用标记复制算法。标记整理算法,其中标记过程与标记清除算法的标记过程一样,但是后续则是让所有存活对象都向内存空间的一端移动,然后直接清理掉边界以外的内存。

移动存活对象并更新引用这些对象的地方是一种极为负重的操作,且必须全程暂停用户应用程序才能进行,这种停顿也被称为“Stop The World”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值