Java虚拟机面试题, Java 的 CMS 垃圾回收器和 G1 垃圾回收器在记忆集的维护上有什么不同?
Java虚拟机面试题, Java 的 CMS 垃圾回收器和 G1 垃圾回收器在记忆集的维护上有什么不同?
QA
Step 1
Q:: Java 的 CMS 垃圾回收器和 G1
垃圾回收器在记忆集的维护上有什么不同?
A:: CMS(Concurrent Mark-Sweep)和 G1(Garbage First)垃圾回收器在记忆集(Remembered Set)的维护上有显著区别。CMS 主要依赖于卡表(Card Table)来追踪旧生代对新生代的引用,它通过遍历卡表来更新引用。而 G1 则通过分区(Region)进行内存管理,每个分区都有其对应的记忆集,用于跟踪其他分区对该分区的引用。G1 的记忆集维护比 CMS 更加复杂和精细,但这也使得 G1
能够在大内存和低延迟场景下提供更好的性能。
Step 2
Q:: 什么是 Java 虚拟机的记忆集?为什么它很重要?
A:: 记忆集(Remembered Set)是垃圾回收器用于追踪特定区域外部的引用集合。它在分代式垃圾回收器中尤为重要,因为它能帮助垃圾回收器只扫描必要的内存区域,而不必扫描整个堆内存。这样可以减少垃圾回收的开销,提升应用的性能。
Step 3
Q:: G1
垃圾回收器如何优化垃圾回收的延迟?
A:: G1 垃圾回收器通过将堆内存分成多个大小相等的区域(Region),并根据垃圾回收的代价和收益选择回收这些区域中的一部分(Garbage First),而不是像 CMS 那样回收整个新生代或旧生代。G1 还可以在回收前预测垃圾回收所需的时间,以此来优化延迟。此外,G1
可以根据用户设定的最大停顿时间(Pause Time Goal),在回收时尽量满足这一目标。
Step 4
Q:: CMS 垃圾回收器的主要优点和缺点是什么?
A:: CMS 垃圾回收器的主要优点是低延迟,它在大多数时间里与应用程序并发工作,因此可以减少应用程序的停顿时间。然而,CMS 的缺点是它无法压缩堆内存,因此容易产生内存碎片,导致长期运行的应用可能会遇到 Full GC。此外,CMS 在高并发情况下可能会出现 'Concurrent Mode Failure'
,即无法及时回收内存,导致应用停顿。
Step 5
Q:: G1
垃圾回收器相比 CMS 有哪些改进?
A:: G1 在多个方面对 CMS 进行了改进。首先,G1 能够对内存进行压缩,减少内存碎片的问题。其次,G1 的垃圾回收过程更加并发化,可以更好地控制停顿时间。此外,G1
提供了对大内存和多处理器环境的更好支持,能够在这些环境下更高效地工作。