栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM之垃圾回收器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM之垃圾回收器


前言

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


一、常见垃圾回收器

以下是JDK8-JDK9常见的垃圾回收器组合:

从以上图可以得出结论:

  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. 并发清除,清除删掉标记阶段判断已死亡的对象。由于同用户线程一起执行,不需要停顿。

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)。

3.优缺点

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

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

总结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995613.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号