常见的垃圾回收算法有哪几种类型?它们各自的优缺点是什么?
考察说明
考查候选人是否掌握垃圾回收算法的分类、核心机制及各自优缺点。
回答思路
- 【回答框架 1】垃圾回收算法主要分为标记-清除、标记-复制、标记-整理和分代收集等,其中前三种是基础算法,分代收集是综合应用。
- 【回答框架 2】标记-清除算法分两步:先标记所有可达对象,再统一回收未被标记的对象。优点是实现简单,缺点是会产生大量内存碎片,且标记和清除两个过程效率都不高,大对象分配可能失败。
- 【回答框架 3】标记-复制算法将内存分为两块,只使用其中一块,回收时将存活对象复制到另一块,然后清空原块。优点是内存连续无碎片,适合存活率低的情况;缺点是可用内存减半,且对象存活率较高时复制开销大。
- 【回答框架 4】标记-整理算法在标记后让所有存活对象向一端移动,然后清理边界外的内存。优点是内存连续且不浪费空间,适合存活率高的老年代;缺点是移动对象需要更新引用,STW时间较长。
- 【回答框架 5】分代收集将堆分为新生代和老年代,新生代采用复制算法,老年代采用标记-整理或标记-清除,综合了各算法优点,是HotSpot等主流JVM的默认策略。
- 【关键点 1】标记-清除:无移动,有碎片,效率受对象数量影响。
- 【关键点 2】标记-复制:无碎片,但内存利用率低,适合低存活率场景。
- 【关键点 3】标记-整理:无碎片,适合高存活率,但移动对象成本高。
- 【关键点 4】分代收集:新生代用复制,老年代用标记-整理,权衡吞吐和延迟。
- 【易错点 1】混淆标记-整理与标记-清除,前者需移动对象并更新引用。
- 【易错点 2】误以为标记-清除没有额外内存开销,实际它需要维护标记位或位图。
- 【易错点 3】认为复制算法总是浪费一半内存,实际上可通过Eden和Survivor区比例优化。