三色标记法与读写屏障, 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端口与客户端建立连接,该连接属于命令通道,利用该通道来下达控 制指令: ...
随机推荐
- POJ1151基本的扫描线求面积
题意: 给定n个矩形的对角坐标,分别是左下和右上,浮点型,求矩形覆盖的面积. 思路: 基本的线段树扫描线求面积,没有坑点,不解释了,提示一点,有的题尤其是线段树扫描线的题需要离散 ...
- SQL注入平台第一关,注入?id=1'不报错的问题
第一关需要在地址栏输入id参数测试是否有注入点 我这里输入 http://localhost/sqli-labs-master/Less-1/?id=1 下一步将id参数改为?id=1' http:/ ...
- 【python】Leetcode每日一题-直方图的水量(接雨水)
[python]Leetcode每日一题-直方图的水量(接雨水) [题目描述] 给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1. 上面是由数组 ...
- ArcGIS JS API使用PrintTask打印地图问题解决汇总
环境:来源于工作过程,使用的API是 arcgis js 3.* 3系API,4.*暂时没测试: 1.数据与打印服务跨域情况下,不能打印问题. 一般情况下,我们发布的数据服务和打印服务是在一台服务 ...
- java设计模式之单例模式你真的会了吗?(懒汉式篇)
java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...
- 新代(Syntec)机床的IP设置
一.前言 通过以太网来做机床联网数据采集时,第一步通常是设置机床的IP和找网口 二.机床IP如何设置? 步骤一.找到设置IP的界面 [维护]>[网络设定] 步骤二.设置IP 设定[IP地址取得方 ...
- pip安装模块或者更新出现问题Error:Could not install packages due to an EnvironmentError
问题分析 出现此问题大致的原因: 就是包安装的位置没有读写的权限,这个多半是因为安装python的时候安装在了C盘,或者其他programs这类的文件夹里 或者就是环境变量的设置的安装位置的问题,导致 ...
- markerdown基础
标题 用#+空格 字体 加粗两边两个** 斜体两边* 斜体加粗三个* 引用 '>' 分割线 三个---或者三个*** 图片 ![截图]() 超链接 点击跳转到文章 []+() 列表 1 + 点+ ...
- docker总结复习
一.概念 1.容器( container-based )虚拟化方案,充分利用了操作系统本身已有的机制和特性,以实现轻量级的虚拟化(每个虚拟机安装的不是完整的虚拟机),甚至有人把他称为新一代的虚拟化技术 ...
- bond4以及vlan子接口配置
场景: 前提,交换机的配置由网络工程师配合! 1.跨交换机做bond,模式为LACP,linux双网卡做bond4,模式为4: 2.系统为centos7.0-123: 3.服务器仅有两张万兆网卡,为e ...