MST

星途 面试题库

面试题:Java垃圾回收机制中,简述常见的垃圾回收算法及其特点

请阐述标记 - 清除算法、复制算法、标记 - 整理算法以及分代收集算法在Java垃圾回收机制中的工作原理,并且分析它们各自的优缺点。
26.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

标记 - 清除算法

  1. 工作原理
    • 标记阶段:从根对象(如栈中的引用、静态变量等)开始遍历,标记所有可达对象。
    • 清除阶段:遍历堆内存,回收所有未被标记的对象(即不可达对象)所占用的内存空间。
  2. 优点
    • 实现简单,不需要额外的空间进行复制操作。
  3. 缺点
    • 空间碎片化:回收后会产生大量不连续的内存碎片,可能导致后续大对象无法分配到足够连续的内存空间。
    • 效率问题:标记和清除两个阶段都需要遍历堆内存,效率较低。

复制算法

  1. 工作原理
    • 将内存分为大小相等的两块,每次只使用其中一块。
    • 当这一块内存使用完,进行垃圾回收时,将存活对象复制到另一块空闲内存中,然后将使用过的内存空间一次性清理掉。
  2. 优点
    • 高效:只需要复制存活对象,并且清理内存空间简单,效率较高。
    • 不会产生内存碎片:因为存活对象是连续复制到新的内存区域,保证了内存的连续性。
  3. 缺点
    • 空间浪费:内存被分为两块,每次只能使用一半,造成了空间的浪费。

标记 - 整理算法

  1. 工作原理
    • 标记阶段:与标记 - 清除算法相同,从根对象开始标记所有可达对象。
    • 整理阶段:将所有存活对象向内存一端移动,然后直接清理掉边界以外的内存空间。
  2. 优点
    • 解决内存碎片问题:通过移动存活对象,保证了内存的连续性,避免了因内存碎片导致的分配问题。
    • 空间利用率高:相比于复制算法,不需要预留一半的空间。
  3. 缺点
    • 效率较低:整理阶段需要移动对象,涉及对象地址的改变,相对标记 - 清除算法的清除阶段更为复杂,效率较低。

分代收集算法

  1. 工作原理
    • 根据对象存活周期的不同将堆内存分为不同的代(如新生代、老年代)。
    • 新生代:对象通常存活时间较短,采用复制算法进行垃圾回收。因为新生代中每次垃圾回收都有大量对象死亡,少量存活,复制算法可以高效地处理这种情况。
    • 老年代:对象存活时间较长,对象数量相对稳定,采用标记 - 清除算法或者标记 - 整理算法。因为老年代对象移动成本较高,标记 - 清除算法或标记 - 整理算法更适合。
  2. 优点
    • 提高回收效率:根据对象的不同特性采用不同的回收算法,提高了整体的垃圾回收效率。
    • 合理利用资源:避免了对整个堆内存采用单一算法带来的性能和空间问题。
  3. 缺点
    • 复杂度增加:分代以及不同代采用不同算法,增加了垃圾回收机制的复杂度。