CMS

  • 并发回收,工作线程和GC线程同时进行,暂停时间短

  • 老年代

  • 分为 四个阶段

    • 初始标记:需要STW,因为初始的垃圾并不多,因此耗费的时间不长
    • 并发标记:垃圾回收线程和工作线程同时执行。一边产生垃圾,一边标记(最耗时的阶段,不过是并发的)
    • 重新标记:STW,对并发标记的过程中新产生的垃圾进行重新标记 / 取消标记
    • 并发清理:清理的过程也会产生新的“浮动垃圾”,需要等下一次CMS重新运行的时候再次清理
  • 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,三色标记算法相关推荐

  1. JVM调优:G1三色标记算法

  2. JVM 调优 2:GC 如何判断对象是否为垃圾,三色标记算法应用原理及存在的问题?

    文章目录 前言 一.如何判断一个对象是否为垃圾? 1.1.reference count(引用计数) 1.2.reference count(引用计数)存在的问题 二.Root Searching(根 ...

  3. 说说关于JVM三色标记算法

    本文来说下关于JVM三色标记算法 文章目录 概述 三色标记算法思想 算法流程 三色标记存在问题 解决办法 CMS回顾 CMS解决办法:增量更新 CMS另两个致命缺陷 G1回顾 G1前置知识 Card ...

  4. JVM 的三色标记算法详解

    本文来说下关于JVM 的三色标记算法. 文章目录 三色标记算法概述 引用计数&可达性分析 分代收集 什么是卡表 卡表的问题 写屏障 伪共享 三色标记算法 基本算法 三色标记算法缺陷 多标 漏标 ...

  5. GC垃圾回收的三色标记算法

    GC中用三种颜色标记不同的对象 (1)黑色:本身强引用,并已处理对象中的子引用 (2)灰色:本身强引用,还没处理对象中的子引用 (3)白色:不可达对象 Mark扫描时根据状态进行标记

  6. JVM 三色标记 增量更新 原始快照

    2.1 基本算法 要找出存活对象,根据可达性分析,从GC Roots开始进行遍历访问,可达的则为存活对象: 最终结果:A/D/E/F/G 可达 我们把遍历对象图过程中遇到的对象,按"是否访问 ...

  7. 内存管理篇(三):Go垃圾回收之三色标记算法

    三色标记法介绍: 三色标记法(tricolor mark-and-sweep algorithm)是传统 Mark-Sweep 的一个改进,它是一个并发的 GC 算法,在Golang中被用作垃圾回收的 ...

  8. 你对JVM三色标记的理解嘛?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 三色标记法是一种 ...

  9. JVM从入门到精通(六):JVM调优必备理论知识 - 3种垃圾清除算法,常见的垃圾回收器

    JVM调优是一层窗户纸,只是看起来很难.学完本节课,让你: 熟悉 GC 常用算法,熟悉常见垃圾回收器,具有实际 JVM 调优实战经验 What is garbage 什么是垃圾?没有引用指向的对象就是 ...

最新文章

  1. 反编译DLL并修改再生成DLL
  2. 实例分割:MaskXRCnn 与Visual Genome数据集
  3. 大促背后的流量利器|手淘push升级 比你更懂你
  4. 一道清华期中考试题(逃)
  5. 使用duilib开发半透明异形窗体程序(附源码和demo)
  6. 基于JAVA的在线图书销售系统
  7. 《软件需求最佳实践》阅读笔记02
  8. java中List分片方法
  9. 使用RMAN对数据文件进行恢复
  10. php模糊搜索 变量,自定义搜索seo变量{param}字符串
  11. Android引入第三方jar包报错java.lang.NoClassDefFoundErro...
  12. [GIS教程] 6.1空间数据采集与处理具体步骤
  13. chmod 755和chmod 4755的区别
  14. 大唐凌烟阁二十四功臣
  15. 一般熟练盲打需要多久_如何学会盲打, 大概需要多长时间?
  16. 从零学习Vue - 02模板语法、el与data两种写法、mvvm模型、数据代理
  17. ajax 实验报告,AJAX实验报告 (4500字).doc
  18. IMEI号和MEID号
  19. 新媒体人必备的10个效率工具,神器收藏起来
  20. 160个破解练习之CrackMe 005 CKme002

热门文章

  1. POJ - 1584 A Round Peg in a Ground Hole(综合几何)
  2. HDU - 4687 Boke and Tsukkomi(一般图最大匹配-带花图)
  3. 27计算机表演赛命题,27届计算机表演赛命题搜索赛答案(数学3)
  4. 外挂学习之路(1)--- bp send 回溯寻找关键call
  5. 0_0 SimpleFactoryMode 简单工厂模式
  6. PyCairo 中的透明度
  7. QEMU 构建系统架构
  8. MongoDB入门教程(1)
  9. 收藏:DPDK内存基本概念
  10. 多线程小抄集(新编四)