面试题答案
一键面试标记 - 清除算法
- 基本原理:
- 标记阶段:垃圾回收器从根对象(如栈中的引用、静态变量等)开始遍历,标记所有可达对象。
- 清除阶段:遍历堆内存,回收所有未被标记的对象(即垃圾对象)所占用的空间。
- 优点:
- 实现简单,不需要额外的空间进行对象的移动。
- 缺点:
- 空间碎片化:回收后会产生大量不连续的内存碎片,可能导致后续大对象无法分配到足够连续的内存空间,即使总的空闲内存足够。
- 效率问题:标记和清除两个过程效率都不高,标记需要遍历所有对象,清除需要遍历整个堆。
标记 - 整理算法
- 基本原理:
- 标记阶段:同标记 - 清除算法,从根对象开始标记所有可达对象。
- 整理阶段:将所有存活的对象(被标记的对象)向一端移动,然后直接清理掉端边界以外的内存空间。
- 优点:
- 解决碎片化问题:通过移动存活对象,整理出连续的内存空间,避免了空间碎片化问题,有利于大对象的分配。
- 缺点:
- 移动开销:移动对象需要计算对象新的位置并更新引用,这增加了处理时间,尤其是在对象数量多的情况下。
复制算法
- 基本原理:
- 将内存分为大小相等的两块,每次只使用其中一块。当这一块内存使用完时,将存活对象复制到另一块空闲内存中,然后清除原来使用的那一块内存。
- 优点:
- 高效性:每次只对半个区域进行垃圾回收,且复制过程中不需要考虑内存碎片问题,效率较高。
- 简单:算法逻辑相对简单,实现容易。
- 缺点:
- 空间浪费:需要两倍的内存空间来实现,因为始终有一半的内存处于空闲状态,以保证存活对象有地方复制。对于大对象的复制开销较大,如果大对象较多,可能会影响效率。