面试题答案
一键面试标记 - 清除(Mark - Sweep)算法
- 工作原理:
- 标记阶段:从根对象(如栈中的引用、静态变量等)开始遍历,标记所有可达对象。
- 清除阶段:遍历堆内存,回收所有未被标记的对象(即不可达对象)所占用的空间。
- 优点:实现简单,不需要额外的空间进行对象复制。
- 缺点:
- 空间碎片化:回收后会产生大量不连续的内存碎片,可能导致后续大对象无法分配足够连续的内存空间。
- 效率问题:标记和清除过程都需要遍历堆内存,效率相对较低。
- 适用场景:适合对象存活率较低,且对空间碎片不太敏感的场景,例如新生代中对象通常存活时间短,可采用此算法。
标记 - 整理(Mark - Compact)算法
- 工作原理:
- 标记阶段:与标记 - 清除算法相同,从根对象开始标记所有可达对象。
- 整理阶段:将所有可达对象向内存一端移动,然后直接清除边界以外的内存,使得存活对象紧密排列。
- 优点:
- 解决空间碎片化:通过整理内存,避免了空间碎片化问题,有利于后续大对象的分配。
- 缺点:
- 效率问题:整理过程需要移动对象,成本较高,特别是在对象数量较多时,移动对象的开销较大。
- 适用场景:适合对象存活率较高的场景,如老年代,对象存活时间长,使用标记 - 整理算法可以有效避免空间碎片化。
复制(Copying)算法
- 工作原理:
- 将内存分为两块大小相等的区域,每次只使用其中一块。当这块区域内存满时,将存活对象复制到另一块区域,然后清空当前使用的区域。
- 优点:
- 高效:只需要复制存活对象,清除操作简单,直接清空原区域即可,速度快。
- 不会产生碎片:复制后的对象在新区域是连续存放的。
- 缺点:
- 空间浪费:需要两倍的内存空间来实现,实际可用内存只有一半。
- 适用场景:适合对象存活率低的场景,如新生代,大多数对象在短时间内就会死亡,复制算法可以高效地回收空间。
效率差异分析
- 新生代:由于对象存活率低,复制算法效率较高,它可以快速复制少量存活对象并清理空间。标记 - 清除算法也可适用,但可能产生碎片。标记 - 整理算法因移动对象开销大,在新生代不太适用。
- 老年代:对象存活率高,标记 - 整理算法更合适,虽然移动对象开销大,但能解决碎片问题。标记 - 清除算法会产生大量碎片,效率和可用性都降低。复制算法因空间浪费严重,在老年代不适用。