JVM之垃圾回收器


前言

上篇介绍了JVM垃圾回收算法,经过上篇的铺垫之后本篇重点介绍JVM的GC回收器,主要内容都参考于《深入理解Java虚拟机》。
本篇重点介绍CMS和G1GC,其他回收器会直接一笔带过。


一、常见垃圾回收器

以下是JDK8-JDK9常见的垃圾回收器组合:
JVM之垃圾回收器_第1张图片
从以上图可以得出结论:

  1. JDK8支持的垃圾回收组合有:Serial+Serial Old,Parallel Scavenge+Parallel Old,CMS+ParNew,Parallel Scavenge+Serial Old,G1 五种组合选择;
  2. JDK9在JDK8基础上新增了 Serial + CMS,ParNew+Serial Old 两种组合。

其中JDK8默认的GC组合是 Parallel Scavenge+Parallel Old,JDK9默认GC是G1GC.

二、CMS收集器

1.简介

CMS(concurrent mark sweep)收集器是一种以获取最短回收停顿时间为目标的的收集器。
从它的名字(mark sweep)就可以看出来它的是基于标记-清除算法实现的。

2.收集过程

过程相对复杂一些,主要有4部分:

  1. 初始标记 ,只是标记一下GC Roots能直接关联到的对像,耗时短,会STW;
  2. 并发标记,从GC Roots的直接关联对象开始遍历整个对象图的过程,耗时长。同用户线程一起执行,不需要停顿。
  3. 重新标记,增量标记,解决并发标记期间用户线程运行时导致标记变动的对象,耗时较短,会STW(解决的是并发标记时用户线程新增的可回收垃圾);
  4. 并发清除,清除删掉标记阶段判断已死亡的对象。由于同用户线程一起执行,不需要停顿。

JVM之垃圾回收器_第2张图片

3.优缺点

优点:
并发收集,低停顿。

缺点:

  1. 由于是并发收集则对处理器资源非常敏感,会占用一部分CPU;
  2. 基于标记-清除算法实现,存在内存碎片化问题(标记-清除算法问题);
  3. 无法处理浮动垃圾,并发标记和并发清理阶段用户线程都在运行,期间产生的垃圾只能留给下一次收集,这个就是浮动垃圾。

三、G1收集器

1.简介

G1收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向于局部收集的设计思路和基于region布局的内存形式(物理分区,逻辑分代)。
值得一提的是JDK8支持G1GC,JDK9默认的垃圾回收器,且CMS沦为了不推荐的垃圾回收器,当做是CMS替代的优化版本。
它衡量标准不再是它属于哪个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大,即Mixed GC模式。

2.收集过程

主要有4个过程:

  1. 初始标记,标记GC Roots能直接关联到的对象(短暂的STW);
  2. 并发标记,从GC Roots开始对堆中对象进行可达性分析,递归扫描整个堆找出要回收对象,与用户线程并行执行(不需要停顿,耗时较长);
  3. 最终标记,增量标记,解决并发标记期间用户线程运行时导致标记变动的对象(较短的STW);
  4. 筛选标记,负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以选择任意多个Region构成回收集,然后把决定回收那一部分Region的存活对象复制到空的region中,再清理掉整个旧region的的全部空间(较长的STW,核心设计,实现了可以设置预计的延迟时间。默认是200ms)。

JVM之垃圾回收器_第3张图片

3.优缺点

优点:
1. 单独使用,不需要组合,参数少,调优成本低;
2. 可以设置预计的停顿时间;
3. 不会有内存碎片化问题(基于标记整理算法来实现的收集器)。

缺点:
1. 需要更多内存支持(分region);
2. 对CPU有要求需要多核(很多并发操作)。

总结

在大内存(>=6G)系统下如果在选择是用CMS和G1推荐使用G1;反之系统小内存(<6G)时由于G1GC分区占空间较多,理论上会比CMS差。

你可能感兴趣的:(JVM,jvm,java,算法)