MST

星途 面试题库

面试题:Java内存回收算法中标记 - 清除算法和标记 - 整理算法的对比

在Java内存回收场景下,标记 - 清除算法和标记 - 整理算法都用于堆内存回收,请详细对比两者在实现过程、优缺点以及适用场景方面的不同。
48.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

实现过程

  • 标记 - 清除算法
    1. 标记阶段:从根对象集合(如栈中的引用、静态变量等)开始遍历,标记所有可达对象。
    2. 清除阶段:遍历堆内存,回收所有未被标记的对象,即不可达对象所占用的内存空间。
  • 标记 - 整理算法
    1. 标记阶段:同标记 - 清除算法,从根对象集合开始遍历,标记所有可达对象。
    2. 整理阶段:将所有可达对象向内存的一端移动,然后直接清理掉边界以外的内存空间。

优缺点

  • 标记 - 清除算法
    • 优点:实现简单,不需要进行对象移动,减少了整理操作带来的额外开销。
    • 缺点
      • 产生内存碎片:由于回收的内存空间是不连续的,会在堆内存中产生大量碎片,可能导致后续大对象无法分配到连续内存空间。
      • 效率较低:标记和清除过程都需要遍历堆内存,时间复杂度较高。
  • 标记 - 整理算法
    • 优点
      • 不会产生内存碎片:通过移动对象,保证了内存的连续性,有利于后续大对象的分配。
      • 空间利用率高:连续的内存空间能更有效地利用。
    • 缺点
      • 整理开销大:移动对象的操作需要复制对象,并且需要调整对象的引用,开销较大。
      • 效率较低:整理过程会消耗较多时间,尤其是对象数量较多时。

适用场景

  • 标记 - 清除算法:适用于对象存活率较低的场景,即大部分对象都是短期存活,很快就会变为不可达对象。在这种场景下,产生的碎片相对较少,并且整理操作的开销可以避免。
  • 标记 - 整理算法:适用于对象存活率较高的场景,或者需要分配大对象的场景。因为连续的内存空间可以更好地满足大对象的分配需求,避免因内存碎片导致的分配失败。