深入理解JVM垃圾收集算法

本文详细介绍了JVM中的垃圾收集机制,特别是分代理论,以及标记复制、标记整理和标记清除三种常见算法。新生代和老年代的特性决定了选择不同的收集策略。标记-复制算法速度快但空间消耗大,而标记-整理和清除则适用于老年代,但效率较低。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相关系列

jvm流程图-优快云博客

jvm优化原则-优快云博客

深入理解jvm执行引擎-优快云博客

深入理解JVM垃圾收集器-优快云博客

分代垃圾收集理论 

当前虚拟机大部分的垃圾收集器都采用了分代收集算法,这个构思并不是个新事物,只是根据对象存活周期的不同将内存划分为几块。常见的将java堆分新生代和老年代这样我们就可以依据各个年龄代的特点选择合适的垃圾收集算法。 

    标记复制算法 

为了解决效率问题,“标记-复制”算法被人们提出来。它将内存分为大小相同的两块,每次操作只使用其中的一块,当这一块内存用完了,把还存活的对象复制到另外一块去,然后再把使用的空间一次性清理掉,这样每次内存回收都是对内存空间的一半进行回收。

 

标记整理算法 

算法分为“标记”和“整理”二个阶段,第一个阶段标记存活的对象,统一回收所有未被标记的对象(一般选择这种)也可以反过来,标记出所需要回收的对象;第二个阶段是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。

标记清除算法 

        算法分为“标记”和“清除”二个阶段,第一个阶段标记存活的对象,统一回收所有未被标记的对象(一般选择这种)也可以反过来,标记出所需要回收的对象;第二阶段统一回收所有被标记的对象。这是最基础的收集算法,相对来说不复杂,但是会带来了二个性能问题:

1、效率问题(如果标记过多,效率不高)

2、空间问题(标记清除后产生大量不连续的空间碎片)

 总结

在新生代中,普遍每次收集大概有99%的对象都会让清理掉,所以只要付出少量的对象复制成本就可以完成每次垃圾收集。老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们选择“标记-整理”或者“标记-清除”算法进行垃圾收集。很重要的一点,“标记-清理”和“标记-整理”垃圾算法会比“标记-复制”垃圾算法慢10倍以上。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值