文
章
目
录
章
目
录
得分点:
- 标记清除算法
- 标记复制算法
- 标记整理算法
标准回答:
垃圾回收算法主要包括标记清除算法、标记复制算法和标记整理算法:
- 标记清除算法:标记清除算法将垃圾回收分为两个阶段:标记和清除。首先,标记出所有需要回收的对象,然后在标记完成后,统一回收掉所有被标记的对象,或者反过来,标记存活的对象,统一回收未被标记的对象。标记清除算法的缺点包括执行效率不稳定,特别是在Java堆中包含大量需要回收的对象时,以及内存空间碎片化问题。
- 标记复制算法:标记复制算法将可用内存分为两块,每次只使用其中一块。当一块内存用完后,将还存活的对象复制到另一块内存,然后清理已使用过的内存。这种算法适用于新生代的垃圾回收,因为新生代中的对象生命周期较短,复制算法可以迅速回收不再使用的对象。然而,它会浪费一半的内存空间。
- 标记整理算法:标记整理算法通常用于老年代对象的垃圾回收。它在标记阶段与标记清除算法相似,但在后续步骤中,不会立即清理被标记的对象,而是将所有存活的对象向内存空间一端移动,然后清理掉边界以外的内存。这种方式可以减少内存碎片化,并且适用于老年代的对象回收。
加分回答:
在新生代的垃圾回收中,标记复制算法较为常见,而在老年代的垃圾回收中,标记整理算法较为常见。标记复制算法的一个改进方案是Appel式回收,它将新生代分为一个较大的Eden空间和两个较小的Survivor空间,以优化内存布局。在HotSpot虚拟机中,Serial、ParNew等新生代收集器采用了这种策略。此外,当Survivor空间不足以容纳一次Minor GC之后存活的对象时,需要依赖其他内存区域进行分配担保。这些算法和策略都是为了在不同场景下优化垃圾回收的性能和效率。