转载请注明出处:http://blog.youkuaiyun.com/linxdcn/article/details/78001373
1 概述
目前,JVM中有四种类型的垃圾收集器。一开始接触HotSpot的垃圾收集器,很容易被许多的名字混淆,《深入理解Java虚拟机》中给每种垃圾收集起了名字(下表第二列),对应在HotSpot中的实现类(下表第三列)
类型 | 名称 | jvm的实现类 | 代 |
---|---|---|---|
1 串行垃圾收集器 | Serial收集器 | def new generation | 新生代 |
1 串行垃圾收集器 | Serial Old收集器 | tenured generation | 老年代 |
2 并行垃圾收集器 | ParNew收集器 | par new generation | 新生代 |
2 并行垃圾收集器 | Parallel Scavenge收集器 | PSYoungGen | 新生代 |
2 并行垃圾收集器 | Parallel Old收集器 | ParOldGen | 老年代 |
3 并发标记扫描垃圾收集器 | CMS收集器 | concurrent mark-sweep generation | 老年代 |
4 G1垃圾收集器 | G1收集器 | garbage-first heap | 均可 |
每种类型的垃圾收集器有它的特点,以及使用范围,下面逐一介绍。
2 串行垃圾回收器
串行垃圾收集器GC示意图
串行垃圾回收器有两个:
- Serial收集器:新生代,复制算法
- Serial Old收集器:老年代,标记-整理算法
优点:
- 实现简单
- 适用于简单的命令行程序和Client模式
缺点:
- Stop the world 时间较长
3 并行垃圾收集器
并行垃圾收集器GC示意图
并行垃圾回收器有三个:
- ParNew收集器:新生代,复制算法,跟Serial收集器基本一样,只是多线程版本,CMS收集器最佳搭配
- Parallel Scavenge收集器:新生代,复制算法,基于吞吐量优化,具备自适应调节策略
- Parallel Old收集器:老年代,标记-整理算法,基于吞吐量优化
优点:
- 在多CPU环境下,比Serial收集器要高效
- Parallel Scavenge收集器和Parallel Old收集器高效率利用CPU时间,适用于后台运算,少交互情况
缺点:
- 仍存在Stop the world 时间较长问题,不能并发GC
4 并发标记扫描垃圾收集器
CMS收集器GC示意图
CMS是基于最短停顿时间,应用于老年代,标记-清除算法的收集器,包括4个步骤:
- 初始标记:仅标记GC Root能直接关联到的对象
- 并发标记:进行GC Root Trancing
- 重新标记:修正并发标记期间,因用户程序运行导致的标记变动的那部分对象的标记记录
- 并发清除:清除对象
优点:
- 大部分时间可与用户线程并发执行,停顿时间小
缺点:
- CMS收集器非常占用CPU资源
- 无法处理在并发清除期间新出现的垃圾(浮动垃圾)
- 基于标记-清除算法,会产生许多碎片
5 G1垃圾收集器
G1收集器GC示意图
G1的垃圾收集过程与CMS十分相似。主要不同在于G1将整个Java堆划分为多个大小相等的独立区域(Region),新生代和老年代不再是物理上连续的,而是逻辑上连续的。
优点:
- 同时实现了并行与并发,并行指多个线程同时进行。并发指能与用户线程同时进行
- 空间整合:整体看是“标记-整理“算法,局部看是“复制“算法
- 可预测停顿时间
缺点:
- 实现复杂
6 总结
新生代、老年代的垃圾收集器有许多,常见的搭配有一下四种:
JVM参数 | 新生代 | 老年代 |
---|---|---|
-XX:+UseSerialGC | Serial | Serial Old |
-XX:+UseParallelGC -XX:+UseParallelOldGC | Parallel Scavenge | Parallel Old |
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC | ParNew | CMS |
-XX:+UseG1GC | G1 | G1 |
7 参考
《深入理解Java虚拟机》——周志明
转载请注明出处:http://blog.youkuaiyun.com/linxdcn/article/details/78001373