当前位置: 代码迷 >> 综合 >> 阿里面试P8 2020 垃圾回收之CMS三色标记算法+Increment Update算法(阿里健康二面 P8岗位)
  详细解决方案

阿里面试P8 2020 垃圾回收之CMS三色标记算法+Increment Update算法(阿里健康二面 P8岗位)

热度:10   发布时间:2024-01-09 10:47:41.0

阿里健康的哥们儿二面的时候问我对垃圾回收算法的理解,我通过给他分析了一波   Remark 阶段的算法 中的SATB(G1)和Increment Update(CMS) 算法 的理解,唉!~可惜了,这哥们儿感觉没看过这个,好像我说的都是天文故事,我很伤心,受伤了,要是说那些简单的算法可能大家都知道,我专门说了个比较有深度的算法,遇到不懂的家伙,zb 失败了,兄弟们你们也要注意这个问题面试官也是有级别的,好的面试技巧就是你所说的都是面试官想听到的东西。

 这里我先说一下  三色标记+Increment Updated 算法的CMS

1. 如何定位垃圾,广域上说有两种方式 :

   1.1.引用计数器 (只要有一个对象被别的对象引用了引用计数器就会+1,这种发式性能最高,但是无法解两个对象决循环引用,但是这两个对象都没有引用使用 的问题)

   1.2.GC Roots 根可达算法(JVM 的GC Roots 需要注意的就是会存在多个区域  例如 : JVM Stack,常量池,JNI 热点指针区,静态变量 可能横跨方法区,heap,native method stack,注:因为在不同版本的JDK 中,存放的位置会不同)

2.说一下当前服务器内存对应的垃圾回收器的选用

   2.1 serial  几十M以内

   2.2 ps 几百M以内

   2.3 cms  20G以内

   2.4 G1   100G 以内(rocketmq 默认就是8G 用的是G1)

   2.5 ZGC 和  Shenandoah 4T 以内

   G1  都是逻辑的分 young ,old 区 是通过Region 来进行划分的(Region 分eden  survivor,old,humouse 可以设置最大32M),ZGC,Shenandoah 则是只有一个区叫  single generation 逻辑上都没有分青年老年代了,而之前的垃圾回收期是物理区分了不同的区。

3.三色标记 是指标记回收的对象

 对象分为三色:(三次标记)

 1.白色是未被标记对象。

 2.灰色是标记自身对象但是没有标记对象的属性对象。(第一次标记产生的对象)

 3.黑色是标记了自身对象和对象的属性对象。(第二次标记产生的对象)

首先三次标记分为   

1.初始标记(GC Roots 直接关联的对象,这里的话有STW )。

2.并发标记(标记的是A对象下所有的属性对象)。

3.重新标记(标记的是GCRoots 下直接关联对象和该对象下所有的属性对象,这里要注意就是G1在这个地方回去读GC 引用栈的引用对象是否有引用,这里的话有STW)。

4.并发清除(针对与白色节点进行清除)。 

上面是我针对与   incremental updated和SATB 这两中算法画的图

为什么需要讲这两个算法,是因为防止漏删,错删除。因为在并发标记的时候C->D 删除了,但是A->D 新增了引用,这个时候因为D是白色未被标记,但是A 是黑色标识是标记了自身对象和对象的属性对象,如果按照这个标记进行最后的并发删除对象,那D就会被删除,但是按理说A->D而D正在被使用,不能被删除所以有了这两个修正的算法。

1.incremental updated -- 是红色的线,新增引用 A->D,关注引用的增加把A会重新标记成为灰色,下次重新扫描属性,这个地方其实是需要重新扫描灰色节点,这里会有性能上的问题,也会搜索其他的节点。

2.SATB 关注引用的删除(对应的是绿色的连接),当C->D 引用消失,要在GC 的引用栈中插入一个->D 的引用,下次标记的时候GC 会针对与这些对象进行标记,这里第一不会改变父引用对象的状态,第二就是不会针对所有的灰色进行二次的搜索。

  相关解决方案