一、CMS及其三色标记算法

1、核心

标记整个图谱的过程分为多步

多个线程相互工作,才能标记完

标记的算法,JVM虚拟机、go语言使用的都是三色标记算法

2、含义

从那个地方开始,用三种颜色替代

一开始,所有对象都是白色-表示从来没有接触过的对象

已经接触过,但未标记其孩子的对象,是灰色对象

找到了该对象以及所有的孩子,是黑色对象

三色是怎么进行标识的:

(1)颜色表10 00 01分别表示颜色

(2)实际:在对象头部的mark word拿出两位来进行标识

3、白色-灰色-黑色的过程

下次开始的时候,线程只需要从灰色开始即可

4、发生的情形

业务线程和垃圾回收线程共同工作的时候

垃圾回收线程找,A找到,待回收,其孩子B找到,但B的孩子D还未找到

此时业务线程继续,被回收的A关联到B的孩子D,而B的引用被标记为空,B标记为黑

此时,D实际上有引用,但被清除了(B到D的引用删除,以为垃圾回收已经结束了)

5、如何修正

需要加屏障

JVM当发现黑色对象的引用指向白色时,进行一些操作--例如将A变成灰色,下次会继续从A开始找【CMS采取的方案】

CMS采取的方法叫:Incremental Update

6、CMS的解决方案存在的bug

并发标记,容易产生漏标

7、CMS怎么修正该bug--remark再标一遍

实际上,其STW的时间仍然很长

8、调优

CMS的调优比较复杂,有几十个参数,都需要掌握

9、建议

原来是:PS PO

内存足够大(1G),可以最直接换成G1

二、G1

1、算法

仍然基于三色标记算法

但未标记的孩子,不会标记为灰色

2、解决方案:SATB Snapshot At the Begining

B-D的引用消失,把引用记下来(白色指向的D)

对被引用对象D进行单独处理(看有没有黑色的引用指过来,如果有,就不将其标记为黑色)

引用指向的都是白对象,如果没有引用,就标记为黑色对象,否则就被标记为白色对象

3、存在问题

找有没有引用指向D

怎么着指向D的对象-扫描?

4、G1的分区模型-从G1开始,都是分区模型

分区后,意味着,当某个分区满了,只回收当前分区,没有必要回收其他分区

回收该分区时,有用的想会移动到其他游泳而位置

可以实现一边分区,其他线程一边运行

5、如何寻找指向当前对象的引用

在G1中,有一个remember set,记录着有多少对象指向当前分区

记忆集中寻找

大概率,白色对象不会变为黑色

6、与其他垃圾回收器的比较

按照停顿时间STW,PS寻找2-3天

建议不要使用CMS,而是使用G1

没有一个默认的jdk版本,是CMS的方式

三、ZGC-Zero pause GC

1、概念

号称0毫秒,如果能达到,就和C/C++没有区别了

采用的方案是颜色指针:color pointer

ZGC关注的是地址本身,而不是实际存储

2、结构

2的42次方内存

现在是44次方,约4T

3、GC的过程

从各个区内,区内都是remapped

从根开始找

标记位标记指针的状态,初始标记为M0

有M0就是有用的,没有 M0,是remapped就是垃圾

线程访问M0时,对应对象的标记就会换成M0

【JVM调优】Day02:CMS的三色标记算法、分区的G1回收器、短时停顿的ZGC回收器的更多相关文章

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

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

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

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

  3. JVM调优——之CMS GC日志分析

    最近在学习JVM和GC调优,今天总结下CMS的一些特点和要点,让我们先简单的看下整个堆年轻代和年老代的垃圾收集器组合(以下配合java8完美支持,其他版本可能稍有不同),其中标红线的则是我们今天要着重 ...

  4. JVM调优——之CMS 常见参数解析

    最近在学习使用CMS这个GC,这里记录下常用的参数. 1. UseCMSCompactAtFullCollection 与 CMSFullGCsBeforeCompaction 有一点需要注意的是:C ...

  5. JVM调优之垃圾定位、垃圾回收算法、垃圾处理器对比

    谈垃圾回收器之前,要先讲讲垃圾回收算法,以及JVM对垃圾的认定策略,JVM垃圾回收器是垃圾回收算法的具体实现,了解了前面的前置知识,有利于对垃圾回收器的理解. 什么是垃圾? 垃圾,主要是指堆上的对象, ...

  6. JVM调优参数、方法、工具以及案例总结

    这种文章挺难写的,一是JVM参数巨多,二是内容枯燥乏味,但是想理解JVM调优又是没法避开的环节,本文主要用来总结梳理便于以后翻阅,主要围绕四个大的方面展开,分别是JVM调优参数.JVM调优方法(流程) ...

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

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

  8. 三色标记法与读写屏障, G1工作过程

    https://www.jianshu.com/p/12544c0ad5c1 https://www.cnblogs.com/GrimMjx/p/12234564.html 自我总结和记忆: 为了解决 ...

  9. JVM调优总结(三)——分代垃圾回收详述

    为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...

  10. JVM调优(三)——基于Btrace的监控调试

    JVM调优(三)--基于Btrace的监控调试 简介 Btrace可以动态地向目标应用程序的字节码注入追踪代码 用到的技术: JavaComplierApi.JVMTI.Agent.Instrumen ...

随机推荐

  1. centos使用Yum安装postgresql 13

    rpm源安装 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat ...

  2. 安装ceph (快速) 步骤二:存储集群

    用 ceph-deploy 从管理节点建立一个 Ceph 存储集群,该集群包含三个节点,以此探索 Ceph 的功能. 创建一个 Ceph 存储集群,它有一个 Monitor 和两个 OSD 守护进程. ...

  3. PAT (Basic Level) Practice 1019 数字黑洞 分数 20

    给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有" ...

  4. 独辟蹊径:逆推Krpano切图算法,实现在浏览器切多层级瓦片图

    前言 此文我首发于CSDN(所以里面的图片有它的水印) 趁着隔离梳理一下之前做的一个有用的功能:在浏览器中去切割多分辨率瓦片图 这是一个有趣的过程,跟我一起探索吧 阅读本文需具备前置知识:对krpan ...

  5. JavaScript之无题之让人烦躁的模块化

    我怎么记得我好像写过相关类型的文章,但是我找遍了我的博客没有-那就再写一遍吧,其实模块化的核心内容也算不上是复杂,只不过需要整理一下,规划一下罢了.嘻嘻. 开始写标题的时候我就在纠结一件事情,就是,先 ...

  6. PHP全栈开发(四): HTML 学习(2. div 布局)

    无序列表,有序列表,自定义列表 无序列表是ul表示,每个元素用li表示 有序列表是ol表示,每个元素用li表示 <ul> <li>首页</li><li> ...

  7. ABC260 作战总结

    ABC260 作战总结 今后开始写一些模拟赛外的其他比赛的总结(也许有题解?). 开场点到另一场\(\text{ARC}\)去了,耽误了点时间,切完前四题发现已经过了\(37\)分钟了,看来自己读题+ ...

  8. laravel config()获取null

      常规开发获取config值的是否发现获取值为null找了下文档,发现laravel是要把config注册到$app里面.   找到这个目录.加入这一行.就可以了

  9. 前端框架Vue------>第一天学习(2) v-if

    API:https://cn.vuejs.org/v2/api/#key 文章目录 5.条件渲染 5.1 . v-if 5.2 . v-else-if 6 .列表渲染 7 .事件监听 5.条件渲染 5 ...

  10. python批量依赖包操作

      1.导出所有的python依赖 pip freeze > requirements.txt #requirements.txt 为自定名称,可以指定路径 2.自动安装所有依赖包 pip in ...