Java 虚拟机面试题, Java 的 CMS 垃圾回收器和 G1 垃圾回收器在记忆集的维护上有什么不同?
Java 虚拟机面试题, Java 的 CMS 垃圾回收器和 G1 垃圾回收器在记忆集的维护上有什么不同?
QA
Step 1
Q:: Java 的 CMS 垃圾回收器和 G1
垃圾回收器在记忆集的维护上有什么不同?
A:: CMS(Concurrent Mark-Sweep)垃圾回收器在维护记忆集时,通过一种叫做“卡表(Card Table)”的数据结构记录堆内区域的修改,帮助标记活跃对象。这种方式比较简单,但是在大规模应用中会引入一定的性能开销。G1(Garbage First)垃圾回收器则采用了一种更加精细的方式,叫做‘精确记忆集(Precise Remembered Set)’,它通过在每个堆区域维护一个类似于哈希表的数据结构,精确记录可能会引用到该区域的其他区域。这种方法使得G1
能更好地管理内存并减少全局暂停的时间。
Step 2
Q:: CMS 和 G1
垃圾回收器的主要区别是什么?
A:: CMS 是一种低停顿的垃圾回收器,适用于老年代的并发收集,但无法处理内存碎片问题,且无法保证每次垃圾回收时都能完全清理。G1
是一种面向服务器应用的低延迟垃圾回收器,通过分区和区域化收集,能够更好地控制回收停顿时间,并可以处理内存碎片问题。
Step 3
Q:: G1
垃圾回收器如何管理和划分堆内存?
A:: G1 将堆划分为多个大小相等的独立区域(Region),这些区域既可以存放年轻代对象,也可以存放老年代对象。每个区域都有自己的记忆集,用于记录可能引用到该区域的对象。通过这种方式,G1
能够在每次回收时灵活地选择需要处理的区域,从而减少全局停顿。
Step 4
Q:: G1
如何实现暂停时间的可预测性?
A:: G1
的设计目标是将全局停顿时间控制在用户可接受的范围内。它通过追踪各个区域的回收成本以及收益,并在每次回收时只处理那些回收收益较高且停顿时间较短的区域,从而实现暂停时间的可预测性。这一过程通过一个叫做‘停顿预测模型’的机制来实现。
Step 5
Q:: CMS 垃圾回收器的缺点是什么?
A:: CMS 的主要缺点是容易产生内存碎片,导致频繁的Full GC,此外,CMS 无法保证每次回收时都能完全清理垃圾(浮动垃圾),因此在某些极端情况下可能会导致‘Concurrent Mode Failure’,从而触发Full GC。