面试题答案
一键面试实现过程
- 标记 - 清除算法:
- 标记阶段:从根对象集合(如栈中的引用、静态变量等)开始遍历,标记所有可达对象。
- 清除阶段:遍历堆内存,回收所有未被标记的对象,即不可达对象所占用的内存空间。
- 标记 - 整理算法:
- 标记阶段:同标记 - 清除算法,从根对象集合开始遍历,标记所有可达对象。
- 整理阶段:将所有可达对象向内存的一端移动,然后直接清理掉边界以外的内存空间。
优缺点
- 标记 - 清除算法:
- 优点:实现简单,不需要进行对象移动,减少了整理操作带来的额外开销。
- 缺点:
- 产生内存碎片:由于回收的内存空间是不连续的,会在堆内存中产生大量碎片,可能导致后续大对象无法分配到连续内存空间。
- 效率较低:标记和清除过程都需要遍历堆内存,时间复杂度较高。
- 标记 - 整理算法:
- 优点:
- 不会产生内存碎片:通过移动对象,保证了内存的连续性,有利于后续大对象的分配。
- 空间利用率高:连续的内存空间能更有效地利用。
- 缺点:
- 整理开销大:移动对象的操作需要复制对象,并且需要调整对象的引用,开销较大。
- 效率较低:整理过程会消耗较多时间,尤其是对象数量较多时。
- 优点:
适用场景
- 标记 - 清除算法:适用于对象存活率较低的场景,即大部分对象都是短期存活,很快就会变为不可达对象。在这种场景下,产生的碎片相对较少,并且整理操作的开销可以避免。
- 标记 - 整理算法:适用于对象存活率较高的场景,或者需要分配大对象的场景。因为连续的内存空间可以更好地满足大对象的分配需求,避免因内存碎片导致的分配失败。