interview
java-virtual-machine
Java 中常见的垃圾收集器有哪些

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 级内存处理,延迟保持在 10ms 以下。

Step 2

Q:: CMS 收集器的工作原理是什么?

A:: CMS 收集器是一种基于“标记-清除”算法的垃圾收集器。它的工作过程分为四个阶段: 1. 初始标记:标记与 GC Root 直接关联的对象,速度非常快。 2. 并发标记:从 GC Root 开始对堆中所有对象进行可达性分析,这个过程是与用户线程一起并发进行的。 3. 重新标记:修正并发标记期间因为用户线程继续运作而导致标记变动的那部分对象,耗时稍长。 4. 并发清除:清除被标记为无用的对象,用户线程在这一阶段也可以继续工作。

Step 3

Q:: G1 收集器是如何减少垃圾收集带来的停顿时间的?

A:: G1 收集器通过将堆划分为多个区域(Region)来进行垃圾收集,避免传统垃圾收集器在堆上大范围扫描的过程。它在收集时只关注那些垃圾最多的区域(称为“回收价值最大”的区域),并通过增量方式逐步清理这些区域,从而控制每次垃圾收集的停顿时间。此外,G1 收集器使用“标记-整理”算法(而非“标记-清除”),这可以有效减少内存碎片的产生,进一步减少停顿时间。

用途

面试中涉及 Java 垃圾收集器的内容,是为了评估候选人对 JVM 内存管理机制的理解,尤其是在处理大规模、高并发 Java 应用时的能力。垃圾收集器的选择与调优直接影响应用的性能和稳定性。例如,在高频交易系统或实时响应系统中,低停顿垃圾收集器(如 CMS 或 ZGC)可能是必须的。理解这些垃圾收集器的工作原理、优缺点、适用场景,能帮助开发者在实际生产环境中做出更合适的技术决策,优化应用的性能和可用性。\n

相关问题

🦆
JVM 中的内存结构是什么样的?

JVM 内存结构主要分为五个区域:方法区、堆、栈、本地方法栈和程序计数器。 1. 方法区:存储已加载的类信息、常量、静态变量等。 2. :存放对象实例,是垃圾收集的主要区域。 3. :存储局部变量表、操作数栈、动态链接、方法出口等。 4. 本地方法栈:与 JVM 调用的本地方法相关。 5. 程序计数器:当前线程所执行的字节码行号指示器。

🦆
Java 中内存泄漏是如何产生的?

尽管 Java 有垃圾收集机制,但仍然可能出现内存泄漏,通常是由于对象被意外持有引用,导致这些对象不能被垃圾收集器回收。例如,长时间未清理的静态集合(如 HashMap)或错误的对象引用链,都会导致内存泄漏。

🦆
Java 中的强引用,软引用,弱引用和虚引用分别是什么?

Java 中的引用类型决定了对象的生命周期。 1. 强引用:即便内存不足,垃圾收集器也不会回收该对象。 2. 软引用:在内存不足时,垃圾收集器会回收这些引用指向的对象。 3. 弱引用:当垃圾收集器运行时,不管内存是否足够,都会回收这些对象。 4. 虚引用:用于跟踪对象被垃圾收集器回收的过程,其本身并不影响对象的生命周期。

🦆
Java 中的内存溢出和内存泄漏的区别是什么?

内存溢出(OutOfMemoryError)是当 JVM 无法再为应用程序分配内存时抛出的错误,通常发生在内存空间不足的情况下。内存泄漏则是指应用程序无意中保持了对对象的引用,导致这些对象无法被垃圾收集器回收,最终可能导致内存溢出。