Skip to content

Commit

Permalink
init CMS
Browse files Browse the repository at this point in the history
  • Loading branch information
shimeng.ni committed Jun 17, 2021
1 parent 08724b6 commit f78510a
Showing 1 changed file with 51 additions and 0 deletions.
51 changes: 51 additions & 0 deletions gc/java_cms.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# CMS 垃圾回收器

## 总览
分析:首先要从概念上捋清楚,CMS 是 hotspot 虚拟机上的一个实现,并不是某种算法。它使用的算法是标记-清扫。但是它有一个特殊的模式,就是可以开启压缩,那么会在回收的时候清扫之后再压缩内存,减少内存碎片。这就是所谓的标记-清扫-压缩算法。

CMS 的面试,大多数时候来说,就是面一下算法的大概流程,并不会涉及特别多的细节——这些细节真的真的很多。

那么我们在面试 CMS 垃圾回收器的时候,要怎么刷出亮点?就是补充细节。

例如,大多数人只能说出,CMS 有初始标记-并发标记-再标记-清扫四个步骤。那么你可以补充预清理阶段。

这种补充细节是有很多个维度的。

另外一个刷亮点的地方,就是补充正向的内存分配。说清楚 CMS 使用了空闲链表来管理空闲内存,也使用了 TLB(Thread local buffer) 来分配内存。

另外一些面试题就是针对某个步骤来抠细节,或者针对使用过的数据结构来抠细节。

此外就是要熟练掌握一些 CMS 的控制参数,这些参数会影响CMS的效果和性能。本质上来说,这一类的问题,属于CMS的调优范围。

但是大体上来说,能够完全背下来流程,那么通过 CMS 垃圾回收器其实是不难的。

## 面试题

### 你了解 CMS 吗?

分析:基础题。这道题基本上面试官就是指望你回答出来 CMS 的基本特征,基本流程。

基本流程我们采用六步来回答,在一般意义上的四步里面引入额外的两步,并发预清理和并发重置。

并发预清理位于并发标记和最终标记之间。

并发重置则是最后一个步骤。


回答:(先回答基本特征)CMS 是一个基于标记-清扫(这是一个钓鱼的说法,因为面试官可能会怀疑你不知道它的压缩过程)算法的并发垃圾回收器,主要用于老年代回收。(这里就会引来其它问题,比如年轻代怎么回收,年轻代的回收和 CMS 是如何合作的)

(回答基本流程)CMS 的基本流程可以分成六个步骤(同样,这个步骤也没涉及到压缩步骤,是因为压缩步骤是一个可选的步骤,这里我们可以等面试官来问):
1. 初始标记:主要是扫描 GC root (点明 GC root,这样面试官可能会进一步问你 CMS 里面的 GC root 有哪些),这个过程是 STW 的;
2. 并发标记:这个过程应用程序可以继续运行;
3. 并发预清理:该步骤主要是为了处理在并发标记阶段应用线程修改过的引用,减少后面重新标记的停顿时间;
4. 重新标记:STW 的,将并发阶段修改过的引用进行校正;
5. 并发清理:主要就是将空闲内存还给 CMS 的空闲链表(这里我们提及了空闲链表,是为了引来相关的问题)。(后面这一段,是点明一个问题,因为很多面试官其实不了解这个,不用指望他会问)如果在这个阶段,又有对象被分配到老年代,那么会被放到特定的链表的位置,因而不会被回收。
6. 并发重置:重置GC阶段使用的数据结构,以备下一次使用(这里我们没说有什么数据结构,也是因为如果面试官不了解就不会问,问了就可以继续说)

(注意,我们这里额外讨论了两个阶段,并发预清理和并发重置。其中并发预清理是重点,所以我们在回答的时候指出了引入这个阶段的目的,是为了减少重新标记的停顿时间)

#### 类似问题
- CMS的执行步骤?
- CMS使用了什么算法?

(下面我们分不同的阶段来看看面试官会怎么问)

0 comments on commit f78510a

Please sign in to comment.