MST

星途 面试题库

面试题:Java中常见垃圾回收算法的特点及效率差异

请简要介绍Java中标记 - 清除(Mark - Sweep)、标记 - 整理(Mark - Compact)和复制(Copying)这三种常见垃圾回收算法,并分析它们在不同场景下的效率差异。
45.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

标记 - 清除(Mark - Sweep)算法

  1. 工作原理
    • 标记阶段:从根对象(如栈中的引用、静态变量等)开始遍历,标记所有可达对象。
    • 清除阶段:遍历堆内存,回收所有未被标记的对象(即不可达对象)所占用的空间。
  2. 优点:实现简单,不需要额外的空间进行对象复制。
  3. 缺点
    • 空间碎片化:回收后会产生大量不连续的内存碎片,可能导致后续大对象无法分配足够连续的内存空间。
    • 效率问题:标记和清除过程都需要遍历堆内存,效率相对较低。
  4. 适用场景:适合对象存活率较低,且对空间碎片不太敏感的场景,例如新生代中对象通常存活时间短,可采用此算法。

标记 - 整理(Mark - Compact)算法

  1. 工作原理
    • 标记阶段:与标记 - 清除算法相同,从根对象开始标记所有可达对象。
    • 整理阶段:将所有可达对象向内存一端移动,然后直接清除边界以外的内存,使得存活对象紧密排列。
  2. 优点
    • 解决空间碎片化:通过整理内存,避免了空间碎片化问题,有利于后续大对象的分配。
  3. 缺点
    • 效率问题:整理过程需要移动对象,成本较高,特别是在对象数量较多时,移动对象的开销较大。
  4. 适用场景:适合对象存活率较高的场景,如老年代,对象存活时间长,使用标记 - 整理算法可以有效避免空间碎片化。

复制(Copying)算法

  1. 工作原理
    • 将内存分为两块大小相等的区域,每次只使用其中一块。当这块区域内存满时,将存活对象复制到另一块区域,然后清空当前使用的区域。
  2. 优点
    • 高效:只需要复制存活对象,清除操作简单,直接清空原区域即可,速度快。
    • 不会产生碎片:复制后的对象在新区域是连续存放的。
  3. 缺点
    • 空间浪费:需要两倍的内存空间来实现,实际可用内存只有一半。
  4. 适用场景:适合对象存活率低的场景,如新生代,大多数对象在短时间内就会死亡,复制算法可以高效地回收空间。

效率差异分析

  1. 新生代:由于对象存活率低,复制算法效率较高,它可以快速复制少量存活对象并清理空间。标记 - 清除算法也可适用,但可能产生碎片。标记 - 整理算法因移动对象开销大,在新生代不太适用。
  2. 老年代:对象存活率高,标记 - 整理算法更合适,虽然移动对象开销大,但能解决碎片问题。标记 - 清除算法会产生大量碎片,效率和可用性都降低。复制算法因空间浪费严重,在老年代不适用。