【理解HotSpot虚拟机】GC垃圾收集器的对比分析

转载请注明出处:http://blog.csdn.net/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:+UseSerialGCSerialSerial Old
-XX:+UseParallelGC -XX:+UseParallelOldGCParallel ScavengeParallel Old
-XX:+UseParNewGC -XX:+UseConcMarkSweepGCParNewCMS
-XX:+UseG1GCG1G1

7 参考

《深入理解Java虚拟机》——周志明


转载请注明出处:http://blog.csdn.net/linxdcn/article/details/78001373

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页