JVM回收算法,垃圾收集器

本文详细解读了分代收集理论,介绍了复制、标记-清除、标记-整理等垃圾收集算法,以及Serial、ParNew、Parallel Scavenge、CMS和G1等常见垃圾收集器的工作原理和应用场景。特别关注了JDK1.8以后的默认选项和各收集器的优缺点。

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

在学习垃圾回收机制之前我们需要知道一个概念:分代收集理论。何为分代收集理论?

分代收集理论:不同的代选择不同的算法 jvm新生代中,采用的复制算法,新生代很多都是朝生夕死的对象,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象 存活几率是比较高的,所以我们必须选 择“标记-清除”或“标记-整理”算法进行垃圾收集。注意,“标记-清 除”或“标记-整理”算法会比复制算法慢10倍以上。

目前可能接触到的垃圾收集算法如下几种:

 

1.标记-清除算法: 首先标记出所有非垃圾的对象(gc root),在标记完成后统一回收所有被标记的对象。它是最基础的收集算法,效率也很高,但是会 带来两个明显的问题: 1. 效率问题(如果标记的对象过多.效率不高) 2. 空间问题(标记清除后会产生大量不连续的碎片) hotspot实现的jvm是标记非垃圾的对象,像微软实现的是标记垃圾对象 实现不同

2. 复制算法 :它可以将内存分为大小相同的两 块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到 另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内 存区间的一半进行回收。(jvm新生代就是有的此算法)

3.标记-整理算法 :标记过程仍然与“标记-清除”算法一 样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一段移 动,然后直接清理掉端边界以外的内存。

总结:垃圾回收算法目前是采用分代收集理论。

有了垃圾收集算法后自然而然地就会出现以垃圾收集算法思想为依据的垃圾收集器。

常见的垃圾收集器:

 在jdk1.8默认的是Paraller垃圾收集器。

下面我们重点来说上面几种垃圾收集器:

1、Serial收集器(-XX:+UseSerialGC  -XX:+UseSerialOldGC) 新生代采用复制算法,老年代采用标记-整理算法。串行化的方式。

2、 ParNew收集器(-XX:+UseParNewGC) ParNew收集器其实就是Serial收集器的多线程版本 新生代采用复制算法,老年代采用标记-整理算法。(ParNew过程全部STW) 只适用于年轻代 通常和CMS搭配使用。

3、Parallel Scavenge收集器(-XX:+UseParallelGC(年轻代),XX:+UseParallelOldGC(老年代)) Parallel Scavenge 收集器类似于ParNew 收集器,Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)。 可以将GC的时间控制在一个范围之内 最重要的区别不能和CMS搭配使用JDK1.8版本默认垃圾收集器使用 Parallel (年轻代) 和 ParallelOldGC(老年代) Parallel 重要适用于内存比较小的 4G差不多 对于大内存可能会有问题,虽然是多线程 但是是stw的时间比较长,用户体验不友好。

4、CMS收集器(-XX:+UseConcMarkSweepGC(old))只能用在老年代 (面试重点) 很长一段时间是ParNew(新生代)搭配CMS(老年代)来使用的。CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它是并发收集器, 让垃圾收集线程与用户线程(基本上)同时工作。 CMS收集器是一种 “标记-清除”算法实现的, 适用于大内存(因为cms将垃圾回收部分细化)。

5、G1收集器(-XX:+UseG1GC) (重点) jdk9默认的 G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值