-
Notifications
You must be signed in to change notification settings - Fork 270
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
shimeng.ni
committed
Jun 17, 2021
1 parent
08724b6
commit f78510a
Showing
1 changed file
with
51 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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使用了什么算法? | ||
|
||
(下面我们分不同的阶段来看看面试官会怎么问) |