关于jvm里面GC的垃圾收集器的一些整理
新生代
- Serial[串行GC]收集器
- 特点:单线程收集;标记-复制算法
- 场景:Client模式下默认新生代收集器;单核机器
- 可以通过-XX:+UseSerialGC来强制指定
- Parallel Scavenge[并行回收GC]收集器
- 特点:目标在于达到可控吞吐量(吞吐量=用户代码运行时间/(用户代码运行时间+垃圾收集时间));标记-整理
- 场景:高效利用CPU,后台运算且不需要太多交互
- 可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数
- ParNew[并行GC]收集器
- 特点:多线程并行收集;标记-复制算法;其他特点与Serial相似
- 缺点:在单CPU场景效果不突出
- 场景:用户交互;配合CMS垃圾收集器
老年代
-
CMS[并发GC]收集器
特点:最短回收停顿时间;标记-清除- 步骤
- 初始标记:标记GC Roots直接关联的对象,速度快
- 并发标记:GC Roots Tracing过程,好市场,与用户进程并发工作
- 重新标记:修正并发标记期间用户进程继续运行而产生变化的标记,耗时比初始标记长,但远小于并发标记
- 并发清除:清除标记的对象
- 缺点
- 对CPU资源敏感
- 无法回收浮动垃圾
- 标记-清除算法,会产生内存碎片,可以通过参数开启碎片的合并整理
- 步骤
-
Serial Old收集器
- 特点:Serial的老年代版本,单线程;标记-整理
- 场景:1.5之前与Parallel Scavenge配合使用;作为CMS的后备预案
-
Parallel Old收集器
- 特点:标记-整理;多线程
- 场景:为了替代Serial Old与Parallel Scavenge配合使用
G1收集器
特点:将整个Java堆划分为多个大小相等的独立区域Region,跟踪各个Region里面的垃圾堆积的价值大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region
-
步骤
-
初始标记:标记GC Roots直接关联的对象
-
并发标记:对堆中对象进行可达性分析,找出存活对象,耗时长,与用户进程并发工作
-
最终标记:修正并发标记期间用户进程继续运行而产生变化的标记
-
筛选回收:对各个Region的回收价值排序,然后根据期望的GC停顿时间制定回收计划
-
垃圾收集器搭配关系
常见的几种收集器
组合关系
红色虚线在 Jdk8废弃(Serial与CMS的组合和ParNew与Serial Old的组合声明废弃),Jdk9时完全弃用
绿色虚线在 Jdk14时, 完全弃用了 CMS垃圾收集器
黄色虚线在 Jdk14时, 弃用了 Parallel Scavenge与 Serial Old的组合
蓝色直线是CMS回收失败时,备选收集器
黑色直线是正在使用
参考:
https://www.jianshu.com/p/92d07f7e88e9