JVM从入门到精通(十):垃圾回收算法串讲:CMS,G1,三色标记算法
CMS
并发回收,工作线程和GC线程同时进行,暂停时间短
老年代
分为 四个阶段:
- 初始标记:需要STW,因为初始的垃圾并不多,因此耗费的时间不长
- 并发标记:垃圾回收线程和工作线程同时执行。一边产生垃圾,一边标记(最耗时的阶段,不过是并发的)
- 重新标记:STW,对并发标记的过程中新产生的垃圾进行重新标记 / 取消标记
- 并发清理:清理的过程也会产生新的“浮动垃圾”,需要等下一次CMS重新运行的时候再次清理
- 初始标记:需要STW,因为初始的垃圾并不多,因此耗费的时间不长
CMS 存在的 问题:
- Memory Fragmentation 内存碎片问题: 标记清除会产生碎片化,如果老年代不能再分配位置,CMS会让 Serial Old 来清理,效率很低。
- Floating Garbage 浮动垃圾问题:如果老年代满了,浮动垃圾还没有清理完,会让 Serial Old 清理。
- 解决:降低触发 CMS 的阈值,保持老年代有足够的空间
java -XX:+PrintFlagsFinal -version | grep CMSInitiatingOccupancyFraction
G1
垃圾优先的垃圾回收器:
G1把内存空间分为一块一块的region。当G1垃圾回收器发现有必要进行垃圾回收的时候,它会优先回收存活对象最少的region,也就是垃圾最多的region。这就是“垃圾优先”。
设计架构的两大重要思想:
1、分而治之的思想(Hbase,各种分库分表等等)
2、分层的思想(网络七层模型)
G1把内存分为一块一块的 region
每一块 region 有自己的逻辑分代:
- old
- suvivor
- eden
- humongous
大对象
G1 也是有 FGC的,对象分配不下的时候,就会产生FGC。
如果G1产生FGC,你应该做什么?
1. 扩内存
2. 提高CPU性能(回收的快,业务逻辑产生对象的速度固定,垃圾回收越快,内存空间越大)
3. 降低MixedGC触发的阈值,让MixedGC提早发生(默认是45%)
特点
适用于需要特别快的响应时间的场景(不需要很高吞吐量)
新老年代的比例是动态的,5%-60%,一般不用手工指定,也不要手工指定。因为这是G1预测停顿时间的基准。它会根据上次回收的时间,进行动态的调整。
先把这两个名词背下来,我们待会儿再讲
- 三色标记
- 颜色指针
card table
我们补充一个概念叫 card table,这是一张用来记录 card 的表,是一个位图。card 是类似于 page,是一页一页的,对象位于card内部
阿里的多租户JVM:赵海平他们做的…,专门针对webapplication的,session base的应用。请求来访问,形成垃圾,请求走了,垃圾就被回收了。
Cset:collection set
有哪些需要被回收,会收集到表格里。
Rset:remembered set
每一的region
并发标记算法
CMS 和 G1 用到的都是三色标记算法。
把对象在逻辑上分成三种颜色。
1、第一种颜色是黑色。他自己是不是垃圾已经被标记完了,而且成员变量会牵扯到他引用的一些对象,也已经标记完了。这时候我们称之为这个对象是黑色。
2、第二种是灰色。本身标记完了,但是还没有标记到他所引用的那些对象也用的那些对象,还是白色没有标记到的,所以这个时候他叫做灰色。
3、还有就是第三种是白色,就是没被标记到的对象,这些对象是白色的。
漏标发生的情况:
打破上述两个条件之一即可:
为什么G1使用SATB?
Rset会不会影响赋值的效率?会!
- 由于Rset的存在,那么每次给对象复制引用的时候,就得做一些额外的操作。
- 指的是在Rset中做一些额外的记录(比如说记录有哪些引用指向了我的对象等等,这些操作在GC中被称为写屏障)。这个写屏障不是之前说的内存屏障,而是GC专有的写屏障。
- 会影响赋值的效率。 没有银弹!NO Silver Bullet!只有特定条件下特定的解决方案,没有通用的解决方案。
JVM从入门到精通(十):垃圾回收算法串讲:CMS,G1,三色标记算法相关推荐
- JVM调优:G1三色标记算法
- JVM 调优 2:GC 如何判断对象是否为垃圾,三色标记算法应用原理及存在的问题?
文章目录 前言 一.如何判断一个对象是否为垃圾? 1.1.reference count(引用计数) 1.2.reference count(引用计数)存在的问题 二.Root Searching(根 ...
- 说说关于JVM三色标记算法
本文来说下关于JVM三色标记算法 文章目录 概述 三色标记算法思想 算法流程 三色标记存在问题 解决办法 CMS回顾 CMS解决办法:增量更新 CMS另两个致命缺陷 G1回顾 G1前置知识 Card ...
- JVM 的三色标记算法详解
本文来说下关于JVM 的三色标记算法. 文章目录 三色标记算法概述 引用计数&可达性分析 分代收集 什么是卡表 卡表的问题 写屏障 伪共享 三色标记算法 基本算法 三色标记算法缺陷 多标 漏标 ...
- GC垃圾回收的三色标记算法
GC中用三种颜色标记不同的对象 (1)黑色:本身强引用,并已处理对象中的子引用 (2)灰色:本身强引用,还没处理对象中的子引用 (3)白色:不可达对象 Mark扫描时根据状态进行标记
- JVM 三色标记 增量更新 原始快照
2.1 基本算法 要找出存活对象,根据可达性分析,从GC Roots开始进行遍历访问,可达的则为存活对象: 最终结果:A/D/E/F/G 可达 我们把遍历对象图过程中遇到的对象,按"是否访问 ...
- 内存管理篇(三):Go垃圾回收之三色标记算法
三色标记法介绍: 三色标记法(tricolor mark-and-sweep algorithm)是传统 Mark-Sweep 的一个改进,它是一个并发的 GC 算法,在Golang中被用作垃圾回收的 ...
- 你对JVM三色标记的理解嘛?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 三色标记法是一种 ...
- JVM从入门到精通(六):JVM调优必备理论知识 - 3种垃圾清除算法,常见的垃圾回收器
JVM调优是一层窗户纸,只是看起来很难.学完本节课,让你: 熟悉 GC 常用算法,熟悉常见垃圾回收器,具有实际 JVM 调优实战经验 What is garbage 什么是垃圾?没有引用指向的对象就是 ...
最新文章
- 反编译DLL并修改再生成DLL
- 实例分割:MaskXRCnn 与Visual Genome数据集
- 大促背后的流量利器|手淘push升级 比你更懂你
- 一道清华期中考试题(逃)
- 使用duilib开发半透明异形窗体程序(附源码和demo)
- 基于JAVA的在线图书销售系统
- 《软件需求最佳实践》阅读笔记02
- java中List分片方法
- 使用RMAN对数据文件进行恢复
- php模糊搜索 变量,自定义搜索seo变量{param}字符串
- Android引入第三方jar包报错java.lang.NoClassDefFoundErro...
- [GIS教程] 6.1空间数据采集与处理具体步骤
- chmod 755和chmod 4755的区别
- 大唐凌烟阁二十四功臣
- 一般熟练盲打需要多久_如何学会盲打,
大概需要多长时间?
- 从零学习Vue - 02模板语法、el与data两种写法、mvvm模型、数据代理
- ajax 实验报告,AJAX实验报告 (4500字).doc
- IMEI号和MEID号
- 新媒体人必备的10个效率工具,神器收藏起来
- 160个破解练习之CrackMe 005 CKme002