Java虚拟机面试题, Java 中的 CMS 和 G1 垃圾收集器如何维持并发的正确性?
Java虚拟机面试题, Java 中的 CMS 和 G1 垃圾收集器如何维持并发的正确性?
QA
Step 1
Q:: Java 中的 CMS 和 G1
垃圾收集器如何维持并发的正确性?
A:: CMS(Concurrent Mark-Sweep)和 G1(Garbage-First)垃圾收集器通过实现并发标记和回收机制来维持并发的正确性。CMS 使用的是 '三色标记' 算法来处理对象的引用关系,并通过 '初始标记'、'并发标记' 和 '重新标记' 阶段来确保在并发期间不会遗漏对任何存活对象的标记。G1 垃圾收集器则通过 '区域化' 的内存布局和分阶段的并发标记与回收过程,使得垃圾收集器能够在保证低停顿的前提下高效工作。G1
还使用了混合回收的策略,在部分收集周期中混合回收老年代和新生代的垃圾,这在一定程度上避免了内存碎片化问题。
Step 2
Q:: CMS 垃圾收集器有哪些优缺点?
A:: 优点:CMS 可以实现低停顿的垃圾收集,非常适合对延迟敏感的应用场景。它在大多数时间里可以与应用线程并发工作,从而减少全局停顿时间。缺点:CMS 的并发清理阶段可能会导致内存碎片化,特别是在长期运行的应用中。此外,它需要消耗更多的 CPU 资源,并且在内存使用接近上限时可能会触发 'Concurrent Mode Failure'
,导致更长时间的全局停顿。
Step 3
Q:: G1
垃圾收集器如何避免传统 GC 的碎片化问题?
A:: G1 垃圾收集器通过区域化的内存管理方式,将堆内存划分为大小相同的区域(Region),每个区域可以独立进行垃圾回收,从而避免了传统垃圾收集器容易出现的碎片化问题。G1
的混合收集(Mixed Collection)策略还可以在回收新生代内存的同时,选择性地回收老年代中的高收益区域(即垃圾占比高的区域),进一步减少内存碎片化。
Step 4
Q:: 为什么 G1 被称为“Garbage-
First”垃圾收集器?
A:: G1 被称为“Garbage-First”垃圾收集器,是因为它在垃圾回收时会优先选择垃圾最多的区域进行回收。G1
使用了启发式算法来判断哪个区域的回收收益最大,从而优先处理这些区域。这种方法使得垃圾收集的效率更高,并且能够在预设的停顿时间内尽可能多地回收垃圾。
Step 5
Q:: G1
的暂停时间预测机制是如何工作的?
A:: G1
通过对每个区域的历史回收数据进行分析,预测在给定时间内能回收多少垃圾,并基于这些数据调整回收计划,以控制回收的停顿时间在一个用户可接受的范围内。用户可以通过设置 MaxGCPauseMillis
参数来指定期望的最大停顿时间,G1
会尝试在这个时间限制内完成垃圾回收。