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工作过程的更多相关文章

  1. Javaer 面试必背系列!超高频八股之三色标记法

    可达性分析可以分成两个阶段 根节点枚举 从根节点开始遍历对象图 前文提到过,在可达性分析中,第一阶段 "根节点枚举" 是必须 STW 的,不然如果分析过程中用户进程还在运行,就可能 ...

  2. GC 卡顿 优化 三色标记优势

    小结: 1. 三色标记的一个明显好处是能够让用户程序和 mark 并发的进行 Go GC 卡顿由秒级降到毫秒级以下:到底做了哪些优化? https://mp.weixin.qq.com/s/2BMGG ...

  3. 一文带你弄懂 JVM 三色标记算法!

    大家好,我是树哥. 最近和一个朋友聊天,他问了我 JVM 的三色标记算法.我脑袋一愣发现竟然完全不知道!于是我带着疑问去网上看了几天的资料,终于搞清楚啥事三色标记算法,它是用来干嘛的,以及它和 CMS ...

  4. G1混合式GC与三色标记算法详解【纯理论】

    继续基于上一次https://www.cnblogs.com/webor2006/p/11146273.html的理论进一步了解G1. G1收集概览: G1算法将堆划分为若干个区域(Region),它 ...

  5. 《CPU的工作过程》

    本文转载自inter官方网址:https://software.intel.com/zh-cn/articles/book-Processor-Architecture_CPU_work_proces ...

  6. Nginx reopen reload作用及工作过程

    http://www.iigrowing.cn/nginx-reopen-reload-zuo-yong-ji-gong-zuo-guo-cheng.html Nginx reopen reload作 ...

  7. MapReduce程序的工作过程

    转自:http://www.aboutyun.com/thread-15494-1-2.html 问题导读1.HDFS框架组成是什么?2.HDFS文件的读写过程是什么?3.MapReduce框架组成是 ...

  8. 测试或运维工作过程中最常用的几个linux命令?

     大家在测试工作过程中,可能会遇到需要你去服务器修改一些配置文件,譬如说某个字段的值是1 则关联老版本,是0则关联新版本,这时候你可能就需要会下vi的命令操作:或者查看session设置的时长,可能需 ...

  9. 主动模式下FTP的详细工作过程(转) 挺详细

    主动模式下FTP的详细工作过程   PORT FTP是常用的FTP工作方式,当客户端的连接请求到来时,FTP服务器会利用默认的21端口与客户端建立连接,该连接属于命令通道,利用该通道来下达控 制指令: ...

随机推荐

  1. Python中的optparse模块的使用

    optparse模块主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数. 实例化一个 OptionParser 对象(可以带参,也可以不带参数),带参的话会把参数变量的内容作为帮助信息输 ...

  2. FreeBSD系统基本操作

    1:系统安装 2:关机与重启命令 立即关机,但是不关闭电源: shutdown -h now 立即关机,并且关闭电源: shutdown -p now 重启命令 shutdown -r now

  3. 查询某软件所连接的外网IP地址

    一:背景环境: 1>:某机械公司用的某些特殊软件,需要实现所有使用某软件的屏蔽其软件所连接的外网ip,其他上网功能不做限制. 二:需求分析:可以查出此软件所连接的外网ip,在路由器的ip过滤中将 ...

  4. 一种巧妙的使用 CSS 制作波浪效果的思路

    在之前,我介绍过几种使用纯 CSS 实现波浪效果的方式,关于它们有两篇相关的文章: 纯 CSS 实现波浪效果! 巧用 CSS 实现酷炫的充电动画 本文将会再介绍另外一种使用 CSS 实现的波浪效果,思 ...

  5. 风变编程(Python自学笔记)第12关-我们都是中国人

    1.类的个例叫做实例:类,是对某个群体的统称(类是某个特定的群体),实例是群体中某个具体的个体. 2.Python中的对象等于类和实例的集合. 3. 类的创建:class+类名+冒号,后面语句要缩进. ...

  6. [Windows] 屏幕截图 - FastStone Capture(FSCapture) v9.4 飞扬时空汉化绿色版(官方地址) 【清晰好用 已验证】

    [Windows] 屏幕截图 - FastStone Capture(FSCapture) v9.4 飞扬时空汉化绿色版(官方地址) [复制链接]     愤怒の葡萄 电梯直达 楼主    发表于 2 ...

  7. 【转载】Linux命令-自动挂载文件/etc/fstab功能详解[转]

    博客园 首页 新随笔 联系 订阅 管理 随笔 - 322  文章 - 0  评论 - 19 Linux命令-自动挂载文件/etc/fstab功能详解[转]     一./etc/fstab文件的作用 ...

  8. HAProxy之三----keepalived配合脚本对HAProxy、ping网关实现高可用检测

    调用脚本参数含义 vrrp_script<SCRIPT_NAME> { #定义一个检测脚本,在global_defs之外配置 script <STRING>|<QUOTE ...

  9. 【转载】 Linux常用命令: zip、unzip 压缩和解压缩命令

    Linux常用命令: zip.unzip 压缩和解压缩命令   Linux常用命令: zip.unzip 压缩和解压缩命令 zip的用法 基本用法是: zip [参数] [打包后的文件名] [打包的目 ...

  10. pip;python包管理工具

    刚开始学习Python时,在看文档和别人的blog介绍安装包有的用easy_install, setuptools, 有的使用pip,distribute,那麽这几个工具有什么关系呢,看一下下面这个图 ...