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. Tomcat容器、JSP和Servlet

    目录 JSP Tomcat.JSP和Servlet JSP JSP全名为Java Server Pages,其根本是一个简化的Servlet设计.JSP技术有点类似ASP技术,它是在传统的HTML网页 ...

  2. Windows核心编程笔记之作业

    创建作业,并加以限制 HANDLE WINAPI CreateJob() { BOOL IsInJob = FALSE; DWORD ErrorCode = NULL; // 不能将已经在作业中的进程 ...

  3. <JVM下篇:性能监控与调优篇>01-概述篇-02-JVM监控及诊断工具-命令行篇

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  4. java之Collection

    java中的Collection可分为List.Set.Queue三种类型. 1.List. List会按照插入的顺序保存对象,较为常用的实现类有ArrayList,LinkedList和Vector ...

  5. Redis(附Win10版本 和可视化工具)

    启动服务端 通过win+r,cmd 运行命令行然后输入如下指令: G: cd software cd G:\software\redis-64.3.0.503 redis-server.exe 这样就 ...

  6. linux下将一个大的文件拆分成若干小文件

    命令:split,例子: 以行数拆分 -l参数: split –l 50 原始文件 拆分后文件名前缀 说明:以50行对文件进行拆分,最后一个文件的行数没有50行以实际行数进行分配,比如有一个名为 wl ...

  7. BUAA软件工程_结对编程

    1.写在前面 项目 内容 所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 结对项目作业 课程目标 培养软件开发能力 本作业对实现目标的具体作用 培养结对编程开发项目的能力 ...

  8. 7.CentOS文件和目录 以及系统与设置命令

    CentOS文件和目录 etc------系统中的配置文件 bin------系统预设执行文件的放置目录 sbin------系统预设执行文件的放置目录 usr------系统预设执行文件的放置目录 ...

  9. 使用 dd 命令进行硬盘 I/O 性能检测

    使用 dd 命令进行硬盘 I/O 性能检测 作者: Vivek Gite 译者: LCTT DongShuaike | 2015-08-28 07:30   评论: 1 收藏: 6 如何使用dd命令测 ...

  10. Linux进阶之TCP三次握手四次挥手

    TCP(Transfer control protocol)传输控制协议 一.两种传输模式: TCP面向有连接 可靠 常用于点对点 微信 UDP面向无连接 高速 常用于点对面 直播 二.数据方向: 在 ...