Java 虚拟机面试题, Java 中有哪些垃圾回收算法?
Java 虚拟机面试题, Java 中有哪些垃圾回收算法?
QA
Step 1
Q:: Java 中有哪些垃圾回收算法?
A:: Java 中的垃圾回收算法主要包括以下几种:
1. **标记-清除算法(Mark-
Sweep)**:
-
原理:遍历所有对象,标记存活对象,然后清除未标记的对象。
-
优点:简单,能够处理较大的堆空间。
-
缺点:存在内存碎片问题,可能导致性能下降。
2.
复制算法(Copying):
-
原理:将存活对象从一块内存区域复制到另一块连续的内存空间中,未复制的对象即为垃圾。
-
优点:没有内存碎片问题,适用于年轻代的垃圾回收。
-
缺点:需要额外的内存空间,复制成本较高。
3. **标记-整理算法(Mark-
Compact)**:
-
原理:标记所有存活对象,并将这些对象移动到内存空间的一端,清除边界外的对象。
-
优点:解决了内存碎片问题,适用于老年代的垃圾回收。
-
缺点:对象移动的开销较大。
4.
分代收集算法(Generational Garbage Collection):
-
原理:基于对象存活时间的不同,将堆空间划分为新生代、老年代,分别采用不同的垃圾回收算法。
-
优点:结合多种算法的优点,提升整体垃圾回收效率。
-
缺点:需要对内存分代进行精细管理,较复杂。
Step 2
Q:: 什么是 Java 中的分代收集机制?
A:: 分代收集机制是 Java 垃圾回收的重要策略。其核心思想是将 Java 堆分为多个代(主要包括新生代、老年代),不同代的对象生命周期不同,因此可以使用不同的垃圾回收算法来优化性能。
-
新生代:存放新创建的对象。由于大部分对象生命周期较短,新生代通常采用复制算法进行回收。
- **老年代**:存放生命周期较长的对象。因为老年代的对象存活时间较长,内存碎片问题较为严重,通常使用标记-
整理算法。
- **永久代/
元空间**:存储类信息、常量、静态变量等。
Step 3
Q:: CMS 和 G1
垃圾回收器的区别是什么?
A:: CMS(Concurrent Mark-Sweep)和 G1
(Garbage First)是两种常见的垃圾回收器,它们有不同的设计目标和应用场景。
-
CMS 垃圾回收器:
- **原理**:采用标记-
清除算法,以最小化应用暂停时间为目标。
-
优点:并发执行,暂停时间较短,适合对响应时间敏感的应用。
-
缺点:会产生内存碎片,可能导致 Full GC(完全垃圾回收)频繁。
- **G1
垃圾回收器**:
-
原理:将堆内存划分为多个区域,使用分代和增量收集的方式,优先回收垃圾最多的区域。
-
优点:能够更好地控制暂停时间,减少内存碎片,适用于大内存、并发应用。
-
缺点:配置和调优复杂度较高。