【JVM调优】Day02:CMS的三色标记算法、分区的G1回收器、短时停顿的ZGC回收器
一、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回收器的更多相关文章
- 一文带你弄懂 JVM 三色标记算法!
大家好,我是树哥. 最近和一个朋友聊天,他问了我 JVM 的三色标记算法.我脑袋一愣发现竟然完全不知道!于是我带着疑问去网上看了几天的资料,终于搞清楚啥事三色标记算法,它是用来干嘛的,以及它和 CMS ...
- G1混合式GC与三色标记算法详解【纯理论】
继续基于上一次https://www.cnblogs.com/webor2006/p/11146273.html的理论进一步了解G1. G1收集概览: G1算法将堆划分为若干个区域(Region),它 ...
- JVM调优——之CMS GC日志分析
最近在学习JVM和GC调优,今天总结下CMS的一些特点和要点,让我们先简单的看下整个堆年轻代和年老代的垃圾收集器组合(以下配合java8完美支持,其他版本可能稍有不同),其中标红线的则是我们今天要着重 ...
- JVM调优——之CMS 常见参数解析
最近在学习使用CMS这个GC,这里记录下常用的参数. 1. UseCMSCompactAtFullCollection 与 CMSFullGCsBeforeCompaction 有一点需要注意的是:C ...
- JVM调优之垃圾定位、垃圾回收算法、垃圾处理器对比
谈垃圾回收器之前,要先讲讲垃圾回收算法,以及JVM对垃圾的认定策略,JVM垃圾回收器是垃圾回收算法的具体实现,了解了前面的前置知识,有利于对垃圾回收器的理解. 什么是垃圾? 垃圾,主要是指堆上的对象, ...
- JVM调优参数、方法、工具以及案例总结
这种文章挺难写的,一是JVM参数巨多,二是内容枯燥乏味,但是想理解JVM调优又是没法避开的环节,本文主要用来总结梳理便于以后翻阅,主要围绕四个大的方面展开,分别是JVM调优参数.JVM调优方法(流程) ...
- GC 卡顿 优化 三色标记优势
小结: 1. 三色标记的一个明显好处是能够让用户程序和 mark 并发的进行 Go GC 卡顿由秒级降到毫秒级以下:到底做了哪些优化? https://mp.weixin.qq.com/s/2BMGG ...
- 三色标记法与读写屏障, G1工作过程
https://www.jianshu.com/p/12544c0ad5c1 https://www.cnblogs.com/GrimMjx/p/12234564.html 自我总结和记忆: 为了解决 ...
- JVM调优总结(三)——分代垃圾回收详述
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...
- JVM调优(三)——基于Btrace的监控调试
JVM调优(三)--基于Btrace的监控调试 简介 Btrace可以动态地向目标应用程序的字节码注入追踪代码 用到的技术: JavaComplierApi.JVMTI.Agent.Instrumen ...
随机推荐
- 微服务系列之Api文档 swagger整合
1.前言 微服务架构随之而来的前后端彻底分离,且服务众多,无论是前后端对接亦或是产品.运营翻看,一个现代化.规范化.可视化.可尝试的文档是多么重要,所以我们这节就说说swagger. Swagger是 ...
- ProxySQL(2):初试读写分离
文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9278839.html 实现一个简单的读写分离 这里通过一个简单的示例实现ProxySQL的读写分离功能,算是 ...
- 第六章:Django 综合篇 - 2:核心配置项
Django的默认配置文件中,包含上百条配置项目,其中很多是我们'一辈子'都不碰到或者不需要单独配置的,这些项目在需要的时候再去查手册. 强调:配置的默认值不是在settings.py文件中!不要以为 ...
- Libgdx游戏开发(2)——接水滴游戏实现
原文:Libgdx游戏开发(2)--接水滴游戏实现 - Stars-One的杂货小窝 本文使用Kotlin语言开发 通过本文的学习可以初步了解以下基础知识的使用: Basic file access ...
- 换工作?试试远程工作「GitHub 热点速览 v.22.40」
近日,潜在某个技术交流群的我发现即将毕业的小伙伴在焦虑实习.校招,刚好本周 GitHub 热榜有个远程工作项目.不妨大家换个思路,"走"出去也许有更多的机会.当然,除了全球的远程工 ...
- gets,fgets,puts,fputs,scanf,printf的作用,联系和区别
转载: https://blog.csdn.net/lc10915819/article/details/12747943
- selenium4-定位单个页面元素
在操作各项页面元素之前,先介绍下如何通过Python代码来找到这些元素.WebDriver提供了18种元素定位方法,共分为两类(定位当个元素.定位组元素),本节先举例详细介绍下selenium4-定位 ...
- 强国杯东杯分区赛miscwp
目录 不要被迷惑 PCAP文件分析 平正开 不要被迷惑 编辑 导出http 编辑 得到flag.zip后直接爆破密码 编辑 得到编辑 然后一键解码 编辑 flag{WImuJeqSNPh ...
- Vue学习之--------组件在Vue脚手架中的使用(代码实现)(2022/7/24)
文章目录 1.第一步编写组件 1.1 编写一个 展示学校的组件 1.2 定义一个展示学生的信息组件 2.第二步引入组件 3.制作一个容器 4.使用Vue接管 容器 5.实际效果 6.友情提示: 7.项 ...
- 怎样在vue中隐藏el-form-item中的值、设置输入框的值是只读
1.如何在前端vue中隐藏某一个元素(el-form-item怎样隐藏) 给每项表单项添加一个自己的id名,并用v-model绑定相对应的数据,利用v-if根据上一个表单项的数据值来进行显示或隐藏 & ...