一、垃圾收集器种类(流行)
二、年轻代垃圾收集器
- Serial 收集器(-XX:+UseSerialGC,复制算法)
- 单线程收集,进行垃圾收集时,必须暂停所有工作线程
- 简单高效,JVM Client 模式下默认的年轻代收集器
- ParNew 收集器(-XX:+UseParNewGc,复制算法)
- 多线程收集,其余行为、特点和 Serial 收集器一样
- JVM Server 模式下首选的年轻代收集器
- Parallel Scavenge 收集器(-XX:+UseParallelGC,复制算法)
- 比起关注用户线程停顿时间,更关注系统吞吐量
- 多核下才有优势,JVM Server 模式下默认的年轻代收集器
三、老年代垃圾收集器
- Serial Old 收集器(-XX:+UseSerialOldGC,标记-整理算法)
- 单线程收集,进行垃圾收集时,必须暂停所有工作线程
- 简单高效,JVM Client 模式下默认的老年代收集器
- Parallel Old 收集器(-XX:+UseParallelOldGC,标记-整理算法)
- 多线程,吞吐量优先
- CMS 收集器(-XX:+UseConcMarkSweepGC,标记-清除算法)
- 收集过程:
- 初始化标记:stop-the-world
- 并发标记:并发追溯标记,程序不会停顿
- 并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象
- 重新标记:暂停虚拟机,扫描 CMS 堆中剩余的对象
- 并发清理:清理垃圾对象,程序不会停顿
- 并发重置:重置 CMS 收集器的数据结构
四、G1收集器
G1 收集器(-XX:+UseG1GC,复制、标记-整理算法),即用于年轻代又用于老年代的收集器。
- 特点:
- 并行并发
- 分代收集
- 空间整合
- 可预测的停顿
- 作用:
- 将整个 Java heap 内存划分成多个大小相等的 region
- 年轻代和老年代不再物理隔离