垃圾回收算法 垃圾回收的基本算法

垃圾回收算法

回收算法主要分为 引用计数器算法和追踪式算法,这里只写主流垃圾回收期采用的追踪式垃圾回收算法

1. 分带收集理论

建立在俩个分代假说之上

  • 弱分代假说:绝大多数对象都是朝生夕灭的
  • 强分代假说:熬过越多次垃圾回收过程的对象越难以消亡

推论:互相引用的俩个对象,是应该倾向于同时生存或者同时消亡的。

由此得出一条经验法则:

  • 跨代引用假说:跨代引用相对于同代引用占极少数

根据这条假说,可以解决跨代引用中扫描整个老年代的问题。只需在新生代中维护一个全局的记忆集,这个结构把老年代分为若干个小块,标识出老年代中哪块区域存在跨代引用,此后在发生MinorGC时,只需把这块区域里的对象加到GC Roots里进行扫描,即可。相比扫描整个老年代维护这样一个记忆集还是比较划算的。

Partial GC:指目标不是整个java堆的垃圾回收

  • 新生代收集:Minor GC/Young GC
  • 老年代收集:Major GC/Old GC
  • 混合收集:MIxed GC 回收整个新生代和部分老年代

FULL GC:整堆收集:收集整个java堆和方法区

介绍三种垃圾回收的基本算法:

1) 标记-清除算法

首先标记回收对象,之后清除;缺点:

  • 效率不稳定,如果堆中还有很多对象,则会导致效率急剧下降
  • 会产生大量内存碎片,碎片太多可能导致大对象无法分配,而提前触发另一次垃圾回收动作

2) 标记复制算法

未了解决标记-清除产生了内存碎片问题。将内存分为大小相同的俩块,每次只是用其中一半,当一块用完了,就将存活的对象复制到另一块上,然后把已经使用过的那一块内存一次性清理掉。缺点内存利用率较低。

现在商用的虚拟机大部分采用这种算法回收新生代,

优化方案:“Appel式回收”(HotSpot Serial ParNew虚拟机都采用这种方式回收新生代)

把新生代分为一块较大的Eden区和俩块较小的Survivor区。每次分配只使用Eden和其中的一块Survivor区。发生回收时,将eden区和使用中的那块Survivor区中所有的存活对象复制到另一块Survivor区,然后清除已使用的区域。(8:1:1)

逃生门设计:当一块Survivor容纳不了一次Minor GC之后的存活对象,此时就需要其他区域(大多是老年代)进行内存担保。

3) 标记-整理算法

标记复制在存活对象较多时需要进行大量的复制操作,效率较低,而且会浪费空间,所以老年代大多采用标记整理算法。

他是一种移动式的回收算法。但移动伴随着风险与收益并存。

移动过程中 需要“Stop the World”(新的ZGC、Shenandoah可以实现与用户程序并发执行)。不移动需要额外的链表来解决内存分配问题

4) 和稀泥时算法

平时采用标记标记-清除算法,等碎片化容忍不了了,在采用标记-整理算法收集一次,获得规整的内存空间。CMS回收器就是基于此实现的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值