三色标记法与读写屏障, G1工作过程
https://www.jianshu.com/p/12544c0ad5c1
https://www.cnblogs.com/GrimMjx/p/12234564.html
自我总结和记忆:
为了解决 三色标记算法 在并发情况下 出现漏标, 多标情况, CMS采用的是 : 写屏障+增量更新 G1采用的是: 写屏障+ snapshot at the begining (SATB)
多标----> 浮动垃圾
本轮GC不会回收,只能等下次GC时候回收
对象成员变量引用发生变化,肯定会经历这三步,
第一步: var G = objE.fieldG; //读
第二步: objE.fieldG = null; // 写
第三步: objD.fieldG = G; // 写
漏标的解决方案: 不同垃圾收集器策略不同
G1 : 这是针对第二步, SATB(snapshot at the beginning)+利用读写屏障: SATB,就是gcRoots开始时候的快照,gc根对象在扫描完成时候, 就已经确定好了引用对象链, 标记的过程就按照这个 引用对象链,进行标记, 如果某一个对象的成员属性引用发生变化时, 将旧的值保存下来到一个集合中, 并发标记往下taching的时候,仍然将集合中的对象,从白色集合中取出,存到灰色集合中
CMS: 这是针对第三步, 增量更新+写屏障: 这不要求保留原始快照, 如果某个对象的成员属性,新增了一个引用, 将这个引用保存到集合中, 并发标记期间,将这个集合中的对象, 从白色集合中取出存到灰色集合中,
jdk11的垃圾收集器: ZGC: 是针对第一步, 读屏障: 当读取成员变量时候,就将他保存到集合中, 并发标记期间,将集合中的对象,从白色集合中取出,存到灰色集合中, 这种很保守,很安全,
Serial收集器 (串行) : 特点: 针对新生代, 复制算法, 单线程收集, 进行垃圾收集的时候,必须暂停所有工作线程,直到完成 : 参数设置: -XX:+UseSerialGC, 通常和SerialOld(老年代收集器)组合
ParNew收集器 这个收集器是Serial收集器的多线程版本, 特点: 除了多线程外,其余行为, 特点和Serial收集器一样, 通常和 CMS(老年代收集器) 组合 参数设置: -XX:+UseParNewGC (强制指定使用ParNew) , -XX:+UseConcMarkSweepGC (指定使用cms后,会默认使用ParNew作为新生代收集器) , -XX:ParallelGCThreads (指定垃圾收集的线程数量, ParNew默认开启的收集线程与CPU的数量相同)
Parallel Scavenge收集器, (吞吐量收集器) 特点: 新生代收集器, 复制算法, 多线程收集, 他的关注点是:CMS等收集器关注点是尽可能缩短垃圾收集时用户线程的停顿时间, Parallel Scavenge收集器关注的是一个可控制的吞吐量
老年代:
Serial Old 老年代收集器, 标记整理算法, 标记压缩算法, 单线程收集 , 作为CMS收集器的后备预案, 当CMS收集器异常时候,它来执行垃圾收集
Parallel Old收集器, 他是Parallel Scavenge收集器的老年代版本, 针对老年代, 标记整理算法, 多线程收集 设置参数: -XX:+UseParallelOldGC
CMS 收集器,并发标记清理, 特点: 针对老年代, 基于标记-清除算法,(不进行压缩,会产生内存碎片) , 以获取最短回收停顿时间为目标, 并发收集, 低停顿, 需要更多的内存, 垃圾收集线程和用户线程同时工作, 参数设置: -XX:+UseConcMarkSweepGC, CMS运作过程:
1)- 初始标记: 仅标记一下 GC Roots能直接关联到的对象, 速度快, 需要STW
2)- 并发标记: 进行GC Roots 可达性对象的过程, 刚才产生的集合中标记出存活对象, 工作线程也在运行, 并不能保证可以标记出所有的存活对象
3)- 重新标记: 为了修正并发标记期间因工作线程继续运作,而导致标记变动的那一部分对象的标记记录, 需要 STW, 且停顿时间比初始标记稍长, 但远比并发标记短, 采用多线程并行执行来提升效率
4)- 并发清除, 回收所有的垃圾对象, 此时工作线程也会工作,会产生浮动垃圾
可以看到,整个过程,只是标记,清除, 所以会产生内存碎片, 耗时最长的并发标记, 并发清除都可以合工作线程一起工作,
缺点: 浮动垃圾, 如果CMS预留内存空间无法满足程序需要, 会出现 Concurrent Mode Failure 失败,此时,临时启用 Serial Old收集器,而导致fullGC, 这样代价很大
解决方法: -XX:+UseCMSCompactAtFullCollection : 作用: CMS出现上面的情况时,不进行FullGC, 而开启内存碎片的合并整理过程, 但合并整理过程无法并发, 停顿时间变长
-XX:+CMSFullGCsBeforeCompaction: 作用: 设置执行多少次不压缩的FullGC后,来一个压缩整理, 为减少合并整理过程的停顿时间,默认为0, 即每次都执行fullGC,不会进行压缩整理
Parallel Old 收集器(老年代) 多线程, 标记-整理算法
G1收集器, 之前介绍的垃圾收集器,都是将堆分为 新生代,surivivor, 老年代, 分代组合不同的垃圾收集器来收集垃圾. G1收集器,采用分而治之的思想,将堆分为一个一个region区域,(最小为1M), 这些region区域,分为四类型: 新生代, surivor, old humonous,
新生代 依然采用复制算法, 会STW, 多线程收集垃圾, 将存活的对象移动到surivor区域或者 old
old 垃圾收集过程, 和CMS很相似
1: 初始标记: 标记 所有GC-Roots根对象, 会STW,
2: 根区间扫描, 扫描幸存者取到old区对象的引用-->到 RSet中
3: 并发标记: GC-Roots往下traching的过程,工作线程也在运行,采用 STAB+写屏障来避免漏标
4: 重新标记: 会STW, 工作线程运行产生的对象进行标记,
5: 并发清除: 回收垃圾对象, 然后将空闲的region区域保存到Cset中
三色标记法与读写屏障, G1工作过程的更多相关文章
- Javaer 面试必背系列!超高频八股之三色标记法
可达性分析可以分成两个阶段 根节点枚举 从根节点开始遍历对象图 前文提到过,在可达性分析中,第一阶段 "根节点枚举" 是必须 STW 的,不然如果分析过程中用户进程还在运行,就可能 ...
- GC 卡顿 优化 三色标记优势
小结: 1. 三色标记的一个明显好处是能够让用户程序和 mark 并发的进行 Go GC 卡顿由秒级降到毫秒级以下:到底做了哪些优化? https://mp.weixin.qq.com/s/2BMGG ...
- 一文带你弄懂 JVM 三色标记算法!
大家好,我是树哥. 最近和一个朋友聊天,他问了我 JVM 的三色标记算法.我脑袋一愣发现竟然完全不知道!于是我带着疑问去网上看了几天的资料,终于搞清楚啥事三色标记算法,它是用来干嘛的,以及它和 CMS ...
- G1混合式GC与三色标记算法详解【纯理论】
继续基于上一次https://www.cnblogs.com/webor2006/p/11146273.html的理论进一步了解G1. G1收集概览: G1算法将堆划分为若干个区域(Region),它 ...
- 《CPU的工作过程》
本文转载自inter官方网址:https://software.intel.com/zh-cn/articles/book-Processor-Architecture_CPU_work_proces ...
- Nginx reopen reload作用及工作过程
http://www.iigrowing.cn/nginx-reopen-reload-zuo-yong-ji-gong-zuo-guo-cheng.html Nginx reopen reload作 ...
- MapReduce程序的工作过程
转自:http://www.aboutyun.com/thread-15494-1-2.html 问题导读1.HDFS框架组成是什么?2.HDFS文件的读写过程是什么?3.MapReduce框架组成是 ...
- 测试或运维工作过程中最常用的几个linux命令?
大家在测试工作过程中,可能会遇到需要你去服务器修改一些配置文件,譬如说某个字段的值是1 则关联老版本,是0则关联新版本,这时候你可能就需要会下vi的命令操作:或者查看session设置的时长,可能需 ...
- 主动模式下FTP的详细工作过程(转) 挺详细
主动模式下FTP的详细工作过程 PORT FTP是常用的FTP工作方式,当客户端的连接请求到来时,FTP服务器会利用默认的21端口与客户端建立连接,该连接属于命令通道,利用该通道来下达控 制指令: ...
随机推荐
- 手撸了一个starter,同事直夸我666~
Spring Boot starter原理 Spring Boot 将常见的开发功能,分成了一个个的starter,这样我们开发功能的时候只需要引入对应的starter,而不需要去引入一堆依赖了!st ...
- 0901-生成对抗网络GAN的原理简介
0901-生成对抗网络GAN的原理简介 目录 一.GAN 概述 二.GAN 的网络结构 三.通过一个举例具体化 GAN 四.GAN 的设计细节 pytorch完整教程目录:https://www.cn ...
- opencv——几何变换原理与实现
摘要 图像几何变换又称为图像空间变换, 它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置.几何变换不改变图像的像素值, 只是在图像平面上进行像素的重新安排. 几何变换大致分为仿射变换.投影变换. ...
- java数组 简单了解
一.关于集合 1.数组,链表和哈希表(散列表)的存储方式 (1)传统的数组结构存储数据会在内存中开辟连续得空间,结合下标从而使得可以快速访问数据,但是删除和添加数据就很浪费资源 (2)链表不需要开辟连 ...
- C#如何加载嵌入到资源的非托管dll
如何加载非托管Dll 我们总会遇到需要加载非Win32的非托管dll,这里推荐一种方式就是将那些非win32的非托管dll嵌入资源的方式,在入口解压并且加载的方式,我先来看看如何实现吧,首先我们准备好 ...
- unbuntu下清理磁盘空间
把很多大文件删除,并清空回收站后,发现可用存储空间并没增大,如图: 用find /home -size +500k 过滤出大于500k bytes的文件,发现原来删除的yuv文件都被置于.cache目 ...
- Mac OSX系统homebrew update Fetching failed问题解决方案
1. brew update error (i) 问题出现及现象描述 昨天换了台电脑,有些软件需要重新安装或更新一下,遇到了下面的问题 cv@xys-MacBook-Pro ~ % brew upda ...
- [刷题] 144 Binary Tree Preorder Traversal
要求 二叉树的前序遍历 实现 递归 栈模拟 定义结构体 Command 模拟指令,字符串s描述命令,树节点node为指令作用的节点 定义栈 Stack 存储命令 1 #include ...
- 通过format学习,python的内部方法是面象对象的-python面向对象
1.常用的形式 s ="{0} {0} qqq {0} xxx {1}".format('dog','cat')print(s) 结果:dog dog qqq dog xxx ca ...
- dpkg -S /usr/lib/mate-notification-daemon/mate-notification-daemon
# dpkg -S /usr/lib/mate-notification-daemon/mate-notification-daemonmate-notification-daemon: /usr/l ...