面试题答案
一键面试- 标记-清除算法(Mark-Sweep):
- 原理:首先从根对象(如栈中的引用、静态变量等)开始遍历,标记所有可到达的对象,然后清除所有未被标记的对象。这些未被标记的对象就是可以回收的垃圾对象。该算法实现简单,但会产生内存碎片,即清理后内存空间不连续,可能导致后续大对象无法分配到足够连续的内存。
- 复制算法(Copying):
- 原理:将内存分为大小相等的两块,每次只使用其中一块。当这块内存使用完,将存活的对象复制到另一块内存,然后把使用过的内存空间一次性清理掉。这种算法不会产生内存碎片,并且分配内存时简单高效,只需移动堆顶指针。但它的缺点是内存利用率低,因为始终有一半的内存处于闲置状态。
- 标记-整理算法(Mark-Compact):
- 原理:与标记 - 清除算法类似,先标记所有存活对象,然后将存活对象向内存一端移动,最后清理边界以外的内存。它解决了标记 - 清除算法产生内存碎片的问题,同时相较于复制算法,提高了内存利用率。不过,移动对象的操作会带来额外的性能开销。
- 分代收集算法(Generational Collection):
- 原理:根据对象存活周期的不同将内存划分为不同的代,如新生代、老年代等。一般来说,新生代中对象朝生夕灭,采用复制算法,因为每次回收都有大量对象可被回收,少量存活对象复制到另一块空间代价较小;老年代中对象存活率高,采用标记 - 清除或标记 - 整理算法,因为复制大量存活对象开销太大。这种算法综合了前面几种算法的优点,根据对象特性采用合适的回收算法,提高了垃圾回收的整体性能。