三色标记法与读写屏障, 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端口与客户端建立连接,该连接属于命令通道,利用该通道来下达控 制指令: ...
随机推荐
- SQLServer数据库及注入方法
目录 SQLServer数据库 SQLServer数据库的查询语句 SA权限开启xp_cmdshell获取主机权限 盲注SQLServer数据库 SQLServer数据库 SQL Server数据库是 ...
- node-util
Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherit ...
- visual studio 将他人的 vtk 程序在本机生成
在网上下载了一些关于vtk的资源,在本机使用visual studio 打开后,生成时出现类似与以下的错误 无法打开包括文件:"vtkStructuredPointsToPolyDataFi ...
- 【vue-03】组件化开发 component
vue组件化思想 组件化是vue的一个重要思想 它提供了一种抽象,让我们可以开发出一个个独立可复用的小组件来构建我们的应用. 任何的应用都会被抽象成一颗组件树. 注册组件 组件的使用分成三个步骤:创建 ...
- PHP解压压缩包文件到指定目录的实现
$src_file为文件路径,上传文件返回压缩包路径即可 public function unzip($src_file, $dest_dir=false, $create_zip_name_dir= ...
- 源码简析XXL-JOB的注册和执行过程
一,前言 XXL-JOB是一个优秀的国产开源分布式任务调度平台,他有着自己的一套调度注册中心,提供了丰富的调度和阻塞策略等,这些都是可视化的操作,使用起来十分方便. 由于是国产的,所以上手还是比较快的 ...
- python爬虫——《英雄联盟》英雄及皮肤图片
还记得那些年一起网吧开黑通宵的日子吗?<英雄联盟>绝对是大学时期的风靡游戏,即使毕业多年的大学同学相聚,难免不怀念一番当时一起玩<英雄联盟>的日子. 今天就给大家分享一下英雄及 ...
- docker运行mysql数据库
1.搜索镜像源是否有mysql镜像 执行语句: sudo docker search mysql 2.拉取需要版本的mysql,执行语句: docker pull mysql:5.7 3.查看安装 ...
- EventSource的自定义实现
前言: 前面两篇文章都介绍了.NET Core 性能诊断工具,其中诊断工具都用到了EventCounters来实时的收集服务器性能指标. 那么收集指标能否自己定义呢? 一.What's EventCo ...
- Linux(深度)系统安装富士施乐(网络)打印机
一般来讲,linux系统识别打印机没有问题,重点难点在于后面设置.此文特别感谢:河北石龙的陈一繁销售代表.P288dw施乐官网并未提供Linux的驱动并在安装过程中遇到很多问题,其不厌其烦的为我联系厂 ...