Java 虚拟机面试题, Java 中常见的垃圾收集器有哪些?
Java 虚拟机面试题, Java 中常见的垃圾收集器有哪些?
QA
Step 1
Q:: Java 中常见的垃圾收集器有哪些?
A:: Java 中常见的垃圾收集器包括 Serial 收集器、Parallel 收集器、CMS (Concurrent Mark-Sweep) 收集器、G1 (Garbage-First) 收集器和 ZGC (Z Garbage Collector)
。
1.
Serial 收集器:单线程工作,适合单 CPU 环境。
2.
Parallel 收集器:多线程收集,适合多核 CPU 环境,主要目标是达到高吞吐量。
3.
CMS 收集器:关注低停顿时间,适合需要响应时间较短的应用程序。
4. **G1
收集器**:面向服务器的垃圾收集器,主要针对具有大堆内存的多核机器设计,能自动划分堆空间,适应性强,且停顿时间可控。
5. **ZGC**:专为超大内存低停顿而设计,支持 TB 级内存处理,延迟保持在 10
ms 以下。
Step 2
Q:: CMS 收集器的工作原理是什么?
A:: CMS 收集器是一种基于“标记-
清除”算法的垃圾收集器。它的工作过程分为四个阶段:
1.
初始标记:标记与 GC Root 直接关联的对象,速度非常快。
2.
并发标记:从 GC Root 开始对堆中所有对象进行可达性分析,这个过程是与用户线程一起并发进行的。
3.
重新标记:修正并发标记期间因为用户线程继续运作而导致标记变动的那部分对象,耗时稍长。
4.
并发清除:清除被标记为无用的对象,用户线程在这一阶段也可以继续工作。
Step 3
Q:: G1
收集器是如何减少垃圾收集带来的停顿时间的?
A:: G1 收集器通过将堆划分为多个区域(Region)来进行垃圾收集,避免传统垃圾收集器在堆上大范围扫描的过程。它在收集时只关注那些垃圾最多的区域(称为“回收价值最大”的区域),并通过增量方式逐步清理这些区域,从而控制每次垃圾收集的停顿时间。此外,G1 收集器使用“标记-整理”算法(而非“标记-
清除”),这可以有效减少内存碎片的产生,进一步减少停顿时间。