Java 虚拟机面试题, Java 中的 CMS 和 G1 垃圾收集器如何维持并发的正确性?
Java 虚拟机面试题, Java 中的 CMS 和 G1 垃圾收集器如何维持并发的正确性?
QA
Step 1
Q:: Java 虚拟机 (JVM)
是什么?
A:: Java 虚拟机 (JVM)
是一个抽象计算模型,它负责执行 Java 字节码并提供与底层操作系统无关的运行环境。JVM 的主要职责包括加载字节码、进行内存管理(包括堆和栈)、进行垃圾回收(GC)、以及提供运行时优化(如 JIT 编译)等。JVM 是 Java 平台的核心,使得 Java 程序可以在不同操作系统上运行而不需要重新编译。
Step 2
Q:: CMS (Concurrent Mark-Sweep)
垃圾收集器如何工作?
A:: CMS 垃圾收集器是一种老年代垃圾收集器,它采用标记-清除算法,以减少在垃圾收集期间应用程序的停顿时间。CMS 的工作过程分为四个主要阶段:1. 初始标记 (Initial Mark):标记所有直接可达的对象,停顿时间较短。2. 并发标记 (Concurrent Mark):在不暂停应用线程的情况下,标记剩余的可达对象。3. 重新标记 (Remark):暂停应用线程,完成标记过程中遗漏的对象,停顿时间较短。4. 并发清除 (Concurrent Sweep)
:在不暂停应用线程的情况下,回收不可达的对象。CMS 的优点是减少了停顿时间,但缺点是它无法整理堆内存空间,可能导致碎片化。
Step 3
Q:: G1 (Garbage First)
垃圾收集器如何工作?
A:: G1 垃圾收集器是为了解决 CMS 垃圾收集器的碎片化问题而引入的。G1 将堆划分为多个大小相等的区域 (Region),这些区域可以在新生代和老年代之间动态分配。G1 的主要工作过程包括:1. 年轻代收集:主要回收新生代区域,并将幸存者对象晋升到老年代。2. 混合收集:同时回收新生代和老年代的部分区域,以应对高内存使用情况。3. 并发标记:类似于 CMS 的并发标记阶段,标记老年代中的存活对象。4. 清理:在不暂停应用线程的情况下,回收不可达的区域。G1
的主要优势是能够在一定的停顿时间内达到较高的垃圾回收效率,并且可以通过参数配置控制停顿时间。
Step 4
Q:: CMS 和 G1
如何维持并发的正确性?
A:: 为了维持并发的正确性,CMS 和 G1 采用了不同的策略。CMS 通过'增量更新'技术,在应用线程和垃圾收集线程之间协调对象的修改,确保标记过程的正确性。G1 则采用了'SATB(Snapshot-At-The-Beginning)'
技术,在标记开始时创建对象图的快照,确保标记过程的准确性。两者的共同目标是保证在并发标记过程中,不会漏标任何存活对象,同时尽量减少对应用线程的干扰。