关于GC(下):CMS和G1GC的比较
简称
- STW —— Stop the World,暂停所有在执行的线程
简史
- 2004年Sun实验室第一次发表G1论文
- JDK6U14中第一次作为实验选项引入
- JDK7中开始作为替换CMS的方案
- JDK9中成为默认的垃圾回收器
- JDK10优化,将其fullGC改为并行: JEP307
- JDK11引入了更新的ZGC,可能会成为G1的潜在替代者
G1特有数据结构和算法
Region
堆仍然有新生代(eden、survivor)、老年代的划分,但是不再要求它们是内存连续的。每个区都由多个Region组成。
部分老年代Region存储Humongous对象(即下图的H),这种对象大小大于等于Region的一半。

(图片来源-Java Hotspot G1 GC的一些关键技术)
SATB算法
全称Snapshot-At-The-Beginning,起始时活对象的快照。在理解SATB前需要先了解以下知识。
三色标记法
CMS和G1的算法都是通过对gc root 进行遍历,并进行三色标记。标记规则为
- 黑色(black): 节点被遍历完成,而且子节点都遍历完成。
- 灰色(gray): 当前正在遍历的节点,而且子节点(即对象的域)还没有遍历。遍历完所有子节点后,将成为黑色
- 白色(white): 还没有遍历到的节点,即灰色节点的子节点。扫描结束仍是白色时会被回收。
并发扫描时,对于白色有两种情况同时发生时,可能会漏标导致被误回收:
- 增加了被黑色引用的关系。
- 被灰色下应用,删除了到它的引用
具体执行过程:https://www.cnblogs.com/javaadu/p/10713956.html
按照R大的说法:CMS的incremental update设计使得它在remark阶段必须重新扫描所有线程栈和整个young gen作为root;G1的SATB设计在remark阶段则只需要扫描剩下的satb_mark_queue。
RSet
全称Remember Set,记录一个Region里的对象被哪些其他Region引用。
相对应地,有另一种辅助数据结构Collection Set(CSet),它记录了GC要收集的Region集合。GC时只需扫描CSet中各个Rset即可。

(Tips for Tuning the Garbage First Garbage Collector)
更详细的访问机制和回收过程这里不再展开,有兴趣可以参考后文引用文献。
Pause Prediction Model
暂停预测模型,G1根据它计算出的历史数据来预测本次收集需要选择的Region数量,从而尽量满足用户设定的目标停顿时间。
具体算法和公式略,可见Java Hotspot G1 GC的一些关键技术
垃圾回收过程

分为以下几步:
- 初始标记(Initial Mark)—— 标记GC root能直接关联的对象(短暂STW)
- 并发标记(Concurrent mark)—— GCRootsTracing,从并发标记中的root遍历,对不可达的对象进行标记,耗时长但可并行
- 最终标记(Final Remark)—— 收集并发标记期间产生的新垃圾(短暂STW),采用了SATB算法比CMS更快
- 筛选回收(Live Data Counting and Evacuation)—— 对各个Region的回收性价比排序,在保证时间可控的情况下清除失活对象,清除Remember Sets
作为对比,CMS的回收过程

- 初始标记(CMS Initial Mark)—— 标记GC root能直接关联的对象(短暂STW)
- 并发标记(CMS Concurrent Mark)—— GCRootsTracing,从并发标记中的root遍历,对不可达的对象进行标记
- 重新标记(CMS Remark)—— 修正并发标记期间因为用户操作导致标记发生变更的对象,有STW
- 并发清除(CMS Concurrent Sweep)
与CMS相比的优势
- 并发度更高,充分利用CPU多线程 —— CMS对CPU资源敏感,需要占用25%的线程,如果核数小于4更会占用一半的资源。
- 整体上是标记-整理(分代),局部是复制(分Region),运行期不产生碎片 —— CMS是标记-清除,会产生空间碎片和本次回收期间产生导致本次无法回收的浮动垃圾
- 可预测的停顿(基于Region)
参考资料
- 周志明.著 《深入理解Java虚拟机》
2.Java Hotspot G1 GC的一些关键技术
3.CMS和G1的回收过程 - 可能是最全面的G1学习笔记
5.G1 SATB和Incremental Update算法的理解
关于GC(下):CMS和G1GC的比较的更多相关文章
- JVM GC算法 CMS 详解(转)
前言 CMS,全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性 ...
- 【转载】为什么不建议<=3G的情况下使用CMS GC
之前曾经有讲过在heap size<=3G的情况下完全不要考虑CMS GC,在heap size>3G的情况下也优先选择ParallelOldGC,而不是CMS GC,只有在暂停时间无法接 ...
- 【转】深入理解Major GC, Full GC, CMS
声明:本文转自http://blog.csdn.net/iter_zc/article/details/41825395,转载务必声明. 很多人都分不清Major GC, Full GC的概念,事实上 ...
- 一次CMS GC问题排查过程(理解原理+读懂GC日志)
这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下.这篇文章分三部分: 1.问题的场景和处理过程:2.GC的一些理论东西:3.看懂GC的日志 先说一下问题吧 ...
- 深入理解Major GC, Full GC, CMS
很多人都分不清Major GC, Full GC的概念,事实上我查了下资料,也没有查到非常精确的Major GC和Full GC的概念定义.分不清这两个概念可能就会对这个问题疑惑:Full GC会引起 ...
- [转]一次CMS GC问题排查过程(理解原理+读懂GC日志)
这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下.这篇文章分三部分: 1.问题的场景和处理过程:2.GC的一些理论东西:3.看懂GC的日志 先说一下问题吧 ...
- JVM调优——之CMS GC日志分析
最近在学习JVM和GC调优,今天总结下CMS的一些特点和要点,让我们先简单的看下整个堆年轻代和年老代的垃圾收集器组合(以下配合java8完美支持,其他版本可能稍有不同),其中标红线的则是我们今天要着重 ...
- 理解CMS GC日志
本文翻译自:https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs 准备工作 JVM的GC日志的主要参数包括如下几个:-XX:+ ...
- JVM 源码解读之 CMS 何时会进行 Full GC
t点击上方"涤生的博客",关注我 转载请注明原创出处,谢谢!如果读完觉得有收获的话,欢迎点赞加关注. 前言 本文内容是基于 JDK 8 在文章 JVM 源码解读之 CMS GC 触 ...
随机推荐
- 体感在js中的调用
体感技术,在于人们可以很直接地使用肢体动作,与周边的装置或环境互动,而无需使用任何复杂的控制设备,便可让人们身临其境地与内容做互动. 体感分为三大类: 惯性感测:主要是以惯性传感器为主,例如用重力传感 ...
- docker容器中安装vim 、telnet、ifconfig命令
一.在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found 问题:apt-get install vim安装vim 命令时,提示:如下内 ...
- SpringBoot2.0 整合 Dubbo框架 ,实现RPC服务远程调用
一.Dubbo框架简介 1.框架依赖 图例说明: 1)图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层 ...
- IdentityServer4 常见问题 - 用户拒绝授权后报错
1.问题说明 在 IdentityServer4 Web 授权中,一般会有一个显示客户端需要获取用户的那些信息的页面,询问用户是否同意: 在这个页面如果我们点击"No, Do Not All ...
- PgadminⅢ对PostgreSQL中的数据导出insert格式的SQL文档给别的数据库用
导出的sql文件:
- Servlet 使用介绍(2)
说明 本篇由于介绍Servlet容器回传请求方法service(ServletRequest req, ServletResponse res);传入参数用户请求参数request和请求返回参数res ...
- Django2.1集成xadmin管理后台所遇到的错误集锦,解决填坑(二)
django默认是有一个admin的后台管理模块,但是丑,功能也不齐全,但是大神给我们已经集成好了xadmin后台,我们拿来用即可,但是呢,django已经升级到2.1版本了,xadmin貌似跟不上节 ...
- scp 拷贝 针对软连接的问题
scp时经常把软连接变成拷贝了两遍,rsync -l可以避免这个问题 1. ln 软连接的scp 我们在系统中,经常用到软连接:当我们从远程机器scp 数据时,这个软连接不会cp过来:而是: 把软连 ...
- 工作日志,go get -v -x github.com/pebbe/zmq4 失败问题
工作日志,go get -v -x github.com/pebbe/zmq4 失败问题 笔者因为工作需要使用ZeroMQ,但是在执行go get -v -x github.com/pebbe/zmq ...
- Android Recovery升级原理
摘要 Recovery模式指的是一种可以对安卓机内部的数据或系统进行修改的模式(类似于windows PE或DOS).也可以称之为安卓的恢复模式,在这个所谓的恢复模式下,我们可以刷入新的安卓系统,或者 ...