Java虚拟机面试题, 为什么 Java 中 CMS 垃圾收集器在发生 Concurrent Mode Failure 时的 Full GC 是单线程的?
Java虚拟机面试题, 为什么 Java 中 CMS 垃圾收集器在发生 Concurrent Mode Failure 时的 Full GC 是单线程的?
QA
Step 1
Q:: 为什么 Java 中 CMS 垃圾收集器在发生 Concurrent Mode Failure 时的 Full GC 是单线程的?
A:: 在CMS(Concurrent Mark-Sweep)垃圾收集器中,Concurrent Mode Failure 是指在并发收集过程中,堆内存不足以分配新对象,导致垃圾收集器被迫中止并转为执行 Full GC(即 Stop-The-World 的垃圾收集)。CMS 的设计理念是最大限度减少应用线程的停顿时间,但在遇到 Concurrent Mode Failure 时,系统需要快速回收尽可能多的内存。这时,CMS 无法继续并发操作,因此会转为单线程的 Full GC。Full GC 是 Stop-The-
World 的过程,系统会暂停所有应用线程,使用单线程来进行垃圾收集,以确保安全性和一致性。
Step 2
Q:: CMS 垃圾收集器的工作原理是什么?
A:: CMS 垃圾收集器采用标记-清除(Mark-Sweep)算法,主要分为四个阶段:初始标记(Initial Mark)、并发标记(Concurrent Mark)、重新标记(Remark)和并发清除(Concurrent Sweep)。初始标记和重新标记阶段需要短暂的 Stop-The-
World 操作,而并发标记和并发清除阶段则与应用程序线程同时进行,目的是尽量减少应用程序的停顿时间。CMS 收集器适用于对响应时间敏感的应用场景。
Step 3
Q:: 什么是 Concurrent Mode Failure?如何避免它?
A:: Concurrent Mode Failure 是指在 CMS 收集器的并发清除阶段,由于内存分配失败导致的垃圾收集失败,这时系统会回退到单线程的 Full GC。避免这种失败的主要方法包括:调整堆内存大小,增加 CMSInitiatingOccupancyFraction 参数(即在堆内存达到多少使用率时触发 CMS),或使用更先进的垃圾收集器,如 G1
。