SATB的标记问题解决之道与G1垃圾收集模式系统详解及最佳实践
继续接着上一次https://www.cnblogs.com/webor2006/p/11148282.html的理论学习,上一次学习到了这:
接着继续:
SATB详解:
- 对于三色算法在concurrent的时候可能产生的漏标记问题,SATB在marking阶段中,对于从gray对象移除的目标引用对象标记为gray,对于black引用的新产生的对象标记为blcak;由于是在开始的时候进行snapshot,因而可能存在Floating Garbage。
- 漏标与误标
误标没什么关系,顶多造成浮动垃圾,在下次gc还是可以回收的,但是漏标的后果是致命的,把本应该存活的对象给回收了,从而影响的程序的正确性。 - 漏标的情况只会发生在白色对象中,且满足以下任意一个条件。
a、并发标记时,应用线程给一个黑色对象的引用类型字段赋值了该白色对象。
b、并发标记时,应用线程删除所有灰色对象到该白色对象的引用。这是为何呢?举个例子来说明这种漏标现象的发生:比如图上所示,有三个gray对象里面有个成员变量都指向了一个白色对象,此时这三个gray里面的成员变量还木有被扫描到,接着应用线程删除了所有灰色对象到该白色对象的引用,如下:
此时该white对象就成为了一个垃圾对象待回收了,目测现在这条件都是如预期,但是!!!假如在删除之前有一个黑色对象也引用该白色对象了,如下:此时就会出现漏标的现象,本来该white对象不是垃圾反而当成垃圾被清理了。
- 对于第一种情况,利用post-write barrier,记录所有新增的引用关系,然后根据这些引用关系为根重新扫描一遍。
- 对于第二种情况,利用pre-write barrier,将所有既将被删除的引用关系的旧引用记录下来,最后以这些旧引用为根重新扫描一遍。
停顿预测模型:
- G1收集器突出表现出来的一点是通过一个停顿预测模型根据用户配置的停顿时间来选择CSet的大小,从而达到用户期待的应用程序暂停时间。
- 通过-XX:MaxGCPauseMillis参数来设置。这一点有点类似于ParallelScavenge收集器。关于停顿时间的设置并不是越短越好。
- 设置的时间越短意味着每次收集的CSet越小【设置的停顿时间越小则收集的垃圾越少,而收集的垃圾越少则意味着收集的region个数越少,而收集的region个数越少意味着由这些被收集的region所构成的CSet就越小】,导致垃圾逐步积累变多,最终不得不退化成Serial GC;停顿时间设置的过长,那么会导致每次都会产生长时间的停顿,影响了程序对外的响应时间。
G1的收集模式:
- Young GC:收集年轻代里的Region。
- Mixed GC:年轻代的所有Region + 全局并发标记阶段选出的收益高的Region。
- 无论是Young GC还是Mixed GC都只是并发拷贝的阶段。
- 分代G1模式下选择CSet有两种子模式,分别对应Young GC和Mixed GC:
Young GC:CSet就是所有年轻代里面的Region。
Mixed GC:CSet是所有年轻代里的Region加上在全局并发标记阶段标记出来的收益高的Region。 - G1的运行过程是这样的:会在Young GC和Mixed GC之间不断地切换运行,同时定期地做全局并发标记,在实在赶不上对象创建速度的情况下使用Full GC(Serial GC,也就是从G1会回收到备选的方案,一定要尽量避免此情况出现)。
- 初始标记是在Young GC上执行的,在进行全局并发标记的时候不会做Mixed GC,在做Mixed GC的时候也不会启动初始标记阶段。
- 当Mixed GC赶不上对象产生的速度的时候就退化成Full GC,这一点是需要重点调优的地方。
G1最佳实践:
- 不断调优暂停时间指标
通过-XX:MaxGCPauseMillis=x可以设置启动应用程序暂停的时间,G1在运行的时候会根据这个参数选择CSet来满足响应时间的设置。一般情况下这个值设置到100ms或者200ms都是可以的(不同情况下会不一样),但是如果设置成50ms就不太合理。暂停时间设置的太短,就会导致出现G1跟不上垃圾产生的速度。最终退化成Full GC。所以对这个参数的调优是一个持续的过程,逐步调整到最佳状态。 - 不要设置新生代和老年代的大小
1、G1收集器在运行的时候会调整新生代和老年代的大小。通过改变代的大小来调整对象晋升的速度以及晋升年龄,从而达到我们为收集器设置的暂停时间目标。
2、设置了新生代大小相当于放弃了G1为我们做的自动调优。我们需要做的只是设置整个堆内存的大小,剩下的交给G1自已去分配各个代的大小既可。 - 关注Evacuation Failure
Evacuation Failure类似于CMS里面的晋升失败,堆空间的垃圾太多导致无法完成Region之间的拷贝,于是不得不退化成Full GC来做一次全局范围内的垃圾收集。
SATB的标记问题解决之道与G1垃圾收集模式系统详解及最佳实践的更多相关文章
- 【甘道夫】HBase基本数据操作详解【完整版,绝对精品】
引言 之前详细写了一篇HBase过滤器的文章,今天把基础的表和数据相关操作补上. 本文档参考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 所有代码均基于“ ...
- java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**
在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...
- java中文乱码解决之道(二)—–字符编码详解:基础知识 + ASCII + GB**
原文出处:http://cmsblogs.com/?p=1412 在上篇博文(java中文乱码解决之道(一)—–认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述 ...
- 转:详解G1垃圾收集器
G1垃圾收集器入门 说明 concurrent: 并发, 多个线程协同做同一件事情(有状态) parallel: 并行, 多个线程各做各的事情(互相间无共享状态) 参考: What’s the dif ...
- G1 垃圾收集器入门
最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的找到一篇写的很棒的文章,粘过来mark下.总结这篇文章和其他的资料,G1可以基本稳定在0.5s到1s左右的延迟,但是并不能保 ...
- 转 G1垃圾收集器入门
转自:http://blog.csdn.net/zhanggang807/article/details/45956325 最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的 ...
- G1垃圾收集器入门-原创译文
G1垃圾收集器入门-原创译文 原文地址 Getting Started with the G1 Garbage Collector 概览 目的 本文介绍了如何使用G1垃圾收集器以及如何与Hotspot ...
- G1 垃圾收集器架构和如何做到可预测的停顿(阿里)
CMS垃圾回收机制 参考:图解 CMS 垃圾回收机制原理,-阿里面试题 CMS与G1的区别 参考:CMS收集器和G1收集器优缺点 写这篇文章是基于阿里面试官的一个问题:众所周期,G1跟其他的垃圾回收算 ...
- 详解 JVM Garbage First(G1) 垃圾收集器(转载)
前言 Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命.如果使用Java 8/9,那么有很大可能希望对G1收集器进行 ...
随机推荐
- 【ARTS】01_47_左耳听风-201900930~201901006
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...
- Data - 深入浅出学统计 - 上篇
本文是已读书籍的内容摘要,少部分有轻微改动,但不影响原文表达. :以漫画形式来讲解最基本的统计概念和方法. ISBN: 9787121299636 https://book.douban.com/su ...
- iOS label出现异常黑色问题
在开发中,有时候会发现label周围有一层灰色的边框,但是我们无论是修改边框的宽度还是颜色,这个边框一直是这个样子,不会发生任何变化. 类似上面这个,有一条条的竖线, 这是因为当设置 UILabel ...
- NAT的配置
实验的拓扑图如下所示 首先我们对路由器进行基础的地址配置 我们先在R2路由器上设置一条连接外网的静态路由 然后我们给PC1设置一个静态NAT 然后使得PC1 通过202.169.10.5 地址访问外网 ...
- [bzoj3829][Poi2014]FarmCraft_树形dp
FarmCraft 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=3829 数据范围:略. 题解: 因为每条边只能必须走两次,所以我们的路径一定是 ...
- 《Mysql - 在Mysql服务出现瓶颈时,有哪些“饮鸩止渴”提高性能的方法?》
一:情景 - 业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内.临时性地提升一些性能. - 在业务高发时候,Mysql 服务压力过大,导致业务受损, 用户的开发负责人说,不管你用 ...
- todo---java中的json探讨
1.json的命名格式 2.json赋值原则 3.json常用的工具 4.json的处理的第三方软件比较 5.json的起源 6.关于json串的对于null ,"" 的不同的第三 ...
- Zuul【文件上传】
1.搭建一个eureka-server注册中心工程 该工程比较简洁,没有太多配置,不在描述,单节点,服务端口:8888 2.创建zuul-gateway网关工程 2.1.工程pom依赖 <dep ...
- Python02之continue,break语句
Python中的break和continue用法基本一样 break和continue都是用在while和for循环中,而不是跳出if...elif..else的判断语句中,跳出是直接跳出语句所在的w ...
- QT 设置程序图标
1.应用窗口左上角的图标.状态栏上显示的图标用setWindowIcon()函数: 2.可执行程序的图标设置: (1).右键项目添加一个资源文件 (2).导入.ico文件图标