Java虚拟机面试题, 什么是 JVM 垃圾回收的 concurrent mode failure?产生它的真正原因是什么?
Java虚拟机面试题, 什么是 JVM 垃圾回收的 concurrent mode failure?产生它的真正原因是什么?
QA
Step 1
Q:: 什么是 JVM 垃圾回收的 concurrent mode failure?
A:: JVM 的垃圾回收机制中,concurrent mode failure 是指在 CMS (Concurrent Mark-Sweep) 收集器中,当 GC 线程在执行并发清理阶段未能及时回收足够的内存,而导致应用线程需要分配内存时发现老年代已经没有足够空间可用,这时系统将会触发 'Stop the World' (STW)
的 Full GC 以便回收更多内存。
Step 2
Q:: 产生 concurrent mode failure 的真正原因是什么?
A:: 产生 concurrent mode failure 的原因通常包括:1. 内存分配速率过高,CMS 垃圾收集器无法及时清理垃圾;2. 标记阶段错误,部分垃圾没有被正确标记;3. 内存碎片化严重,虽然有足够的内存总量,但无法找到连续的内存块来满足大对象的分配;4.
配置的老年代内存空间过小。
Step 3
Q:: 如何避免 JVM 中的 concurrent mode failure?
A:: 可以通过以下方式减少或避免 concurrent mode failure 的发生:1. 增加老年代内存大小,降低内存碎片化;2. 调整 CMS 的启动阈值 (CMSInitiatingOccupancyFraction),使其提前开始垃圾回收;3. 使用 CMS 的压缩模式 (-XX:+UseCMSCompactAtFullCollection),减少内存碎片;4. 使用 G1 收集器来替代 CMS,G1
收集器对内存碎片问题处理得更好。
Step 4
Q:: 在 Full GC 中,Stop the World 是什么?为什么会发生?
A:: Stop the World (STW)
是 JVM 在执行垃圾回收时暂停所有应用线程的行为。发生 STW 的原因通常是 JVM 需要进行一项耗时的操作,而不能允许应用线程继续运行,以保证数据的一致性。这种情况在 Full GC、ClassLoader 卸载以及其他 JVM 内部操作时都会发生。