垃圾收集器
垃圾收集
垃圾收集器之间的联系
有连线说明可以搭配使用
年轻代常见的垃圾收集器
Serial收集器(-XX:+UseSerialGC,复制算法)
- 复制算法
- 单线程收集,进行垃圾收集时,必须暂停所有工作线程
- 简单高效,Client模式下默认的年轻代收集器
ParNew收集器(-XX:+UseParNewGC,复制算法)
- 复制算法
- 多线程收集,其余的行为、特点和Serial收集器一样
- 单核执行效率不如Serial,在多核下执行才有优势
Parallel Scavenge收集器(-xx:+UseParallelGC)
- 复制算法
- 比起关注用户线程停顿时间,更关注系统吞吐量
- 吞吐量 = 运行用户代码的时间 / (运行用户代码的时间 + 垃圾收集的时间)
- 在多核下执行才有优势,Server模式下默认的年轻代收集器
老年代常见的垃圾收集器
Serial Old收集器(-XX:+UseSerialOldGC)
- 标记-整理算法
- 单线程收集,进行垃圾收集时,必须暂停所有工作线程
- 简单高效,Client模式下默认的老年代收集器
Parallel Old收集器(-XX:+UseParallelOldGC)
- 标记-整理算法
- 多线程,吞吐量优先
CMS收集器(-XX:+UseConcMarkSweepGC)
- 标记-清除算法
- 尽可能缩短了停顿时间
- 步骤
- 初始化标记:stop-the-world
- 并发标记:并发追溯标记,程序不会停顿
- 并发预清理:查找执行并发标记阶段从年轻代晋升到老年代的对象
- 重新标记:暂停虚拟机,扫描CMS堆中的剩余对象
- 并发清理:清理垃圾对象,程序不会停顿
- 并发重置:重置CMS收集器的数据结构
G1收集器(-XX:+UseG1GC)
Garbage First收集器
- 复制+标记-整理算法
- 并行和并发
- 分代收集
- 空间整合
- 可预测的停顿
- 将整个Java堆内存划分为多个大小相等的Region
- 年轻代和老年代不再物理隔离
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Alfred的小站!