JVM从入门到精通(十):垃圾回收算法串讲:CMS,G1,三色标记算法

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!只有特定条件下特定的解决方案,没有通用的解决方案。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章