JVM垃圾回收算法-简单总结

本文详细介绍了垃圾收集算法的四种主要类型:标记-清除算法,其效率不高且易产生内存碎片;复制算法,适用于新生代,能高效回收但牺牲了部分内存;标记-整理算法,针对老年代,避免碎片但效率较低;以及分代收集算法,根据对象生命周期采用不同策略,提高了回收效率。理解这些算法对于优化JVM性能至关重要。
摘要由CSDN通过智能技术生成

一、标记-清除算法

1、标记

标记所有需要回收的对象
第一次标记: 在经过可达性分析算法后,某个对象没有和GC Root相关引用链的时候,将会把这个对象加入到一个队列中。
第二次标记: 对队列中的对象进行第二次标记,如果对象和GC Root有重新建立应用链的时候就把该对象移除队列不进行回收。

2、清除

在这里插入图片描述

优点: 最基础的可达性算法,后续的收集算法都是基于这种思想实现
缺点: 标记和清除的效率不高,会产生大量的内存碎片,导致创建大对象的时候找不到连续的内存空间。

二、复制算法

将内存按容量分成大小相同的两块,当一块中的内存空间用完之后,把存活的对象移动到另一块内存中,然后清理之前使用过的内存空间。(HotSpot虚拟机新生代采用的回收算法就是用的复制算法)
在这里插入图片描述

优点: 实现简单,效率高。解决了标记-清楚算法导致的会产生内存碎片的问题。
缺点: 牺牲了一半的内存空间 ,效率随对象的存活率升高而降低。
HotSpot虚拟机新生代内存布局及算法新生代内存分配一块较大的Eden空间和两块较小的Survivor空间(8:1:1)每次使用Eden和其中一块Survivor空间回收时将Eden和Survivor空间中存活的复制到Survivor的另一块空间上最后清理掉Eden和使用过的Survivor空间,空间分配担保在minor gc之前虚拟机会检测老年代最大的连续空间是否大于新生代所有对象的总空间
    大于,说明minor gc是安全的,可以进行minor gc
    小于,虚拟机会查看空间分配担保是否开启(HandlePromotionFailure)
        开启,会检测老年代最大可用的连续内存空间是否大于历次晋升到老年代对象的平均大小。若是大于就会产生进行一次minor gc,若是失败,则重新进行一次full gc
        关闭,则不允许冒险,直接进行full gc

三、标记-整理算法

标记-整理算法是根据老年代的特点应运而生

1、标记

标记过程和标记-清除算法一致(也是基于可达性分析法)

2、整理

和标记-清除不同的是,整理的是存活对象。让存活对象向一端移动,然后直接清理掉边界以外的内存。
在这里插入图片描述

优点:不会像复制算法那样随着内存对象的升高而降低效率,不像标记清除那样会产生不连续的内存碎片
缺点:执行过程繁琐,效率低

四、分代收集算法

当前商业虚拟机的垃圾收集都是采用“ 分代收集 ”算法。

根据对象存活周期的不同将内存划分为几块。一般把java堆分为新生代和老年代。JVM根据各个年代的特点采用不同的收集算法。

新生代中,每次进行垃圾回收都会发现大量对象死去,只有少量存活,因此比较适合复制算法。只需要付出少量存活对象的复制成本就可以完成收集。

老年代中,因为对象存活率较高,没有额外的空间进行分配担保,所以适合标记-清理、标记-整理算法来进行回收。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值