JVM垃圾回收算法

本文介绍了垃圾回收的四种主要算法:标记-清除、复制、标记整理以及分代收集。标记-清除算法效率较低且产生内存碎片;复制算法通过将内存分为两半来提高效率,常用于新生代;标记整理算法适用于老年代,避免了内存碎片;分代收集结合各算法优点,针对不同代别使用不同的回收策略。
摘要由CSDN通过智能技术生成

一、标记-清除算法

分为标记和清除两个过程:

标记出所有需要回收的对象,在标记完成后统一回收被标记的对象。

  • 缺点:1、效率低,标记与清除的两个过程效率都不高;
  • 2、空间问题。标记清除后会产生大量不连续的内存碎片,在之后的程序运行中如果需要分配占用内存大的对象而不存在连续的内存,则不得不提前触发一次垃圾收集动作。

 

图来自JavaGuide 

二、复制算法

在标记清除算法的基础上做出了改进,将内存分为相同大小的两部分,每次使用其中的一块;当这块使用完后将存活对象复制到另一边,再将这块的内存一次性清理掉。每次只对一半的内存进行回收。目前大多数商业虚拟机都使用复制算法,但并不是1:1内存分配;一般将内存分为一块Eden区和两块Survivor区(HotSpot区为Eden与Survivor区内存比为8:1),当发生垃圾回收时,先将Eden区和一块Survivor区的存活对象复制到另一块Survivor上,之后再进行清理;如果另一块Survivor的内存已用完则需要去老年代进行内存担保。

三、标记整理算法

复制算法在对象存活率较高时会发生多次复制使效率低下,而且每次只能使用50%的空间而用另一半做内存担保,老年代一般不使用这种算法。

根据老年代的特征有人提出了标记-整理算法,与标记清理算法不同的是,在每次回收前将存活对象移动到一端,并清除端边界以外的内存。

æ è®°-æ´çç®æ³

 

四、分代收集算法

在目前的商业虚拟机垃圾回收算法中一般都采用分代收集算法,即将内存划分为老年代和新生代,根据不同内存对象之间的特性选择不同垃圾回收算法;新生代对象存活率低,98%都是朝令夕改,因此采用复制算法,只需复制很少的对象成本就可完成新生代的垃圾回收;而老年代对象存活率较高,没有额外的空间进行分配担保,因此采用标记-清除或标记-整理算法。
 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值