面试题答案
一键面试1. 标记 - 清除算法
- 优点:
- 实现简单,不需要额外的空间进行对象复制。
- 缺点:
- 效率问题,标记和清除两个过程的效率都不高。
- 空间问题,标记清除后会产生大量不连续的内存碎片,可能导致后续大对象无法分配内存。
- 适用场景:适用于对象存活率低,即短时间内有大量对象创建和销毁的场景,对内存碎片不敏感的应用。
2. 标记 - 整理算法
- 优点:
- 解决了标记 - 清除算法的内存碎片问题,通过将存活对象向一端移动,使得内存空间连续,方便后续内存分配。
- 缺点:
- 整理过程需要移动对象,这涉及到对象引用更新等操作,成本较高。
- 移动对象时会暂停用户线程,影响应用响应时间。
- 适用场景:适用于老年代,对象存活率高,需要连续内存空间的场景,对响应时间要求不是特别高的应用。
3. 复制算法
- 优点:
- 高效,只需将存活对象复制到另一块空间,无需标记和清除,速度快。
- 不会产生内存碎片,因为复制后的空间是连续的。
- 缺点:
- 空间浪费,需要两倍的内存空间来进行对象复制。
- 对于大对象的复制成本较高。
- 适用场景:适用于新生代,对象存活率低,大部分对象朝生夕灭的场景,可利用复制算法的高效性。
根据应用特点选择合适的垃圾回收器及优化垃圾回收机制
- 内存需求:
- 如果应用需要处理大量数据,对内存要求高,尽量避免使用复制算法,因为其空间开销大。对于老年代可以考虑标记 - 整理算法的垃圾回收器,如Serial Old、Parallel Old 。新生代可使用ParNew等基于复制算法但优化了空间利用的垃圾回收器。
- 如果内存充足,可以选择一些相对复杂但更高效的垃圾回收器,如G1,它可以更好地管理大内存并平衡停顿时间和吞吐量。
- 响应时间:
- 对于响应时间敏感的应用,如交互式应用、实时系统等,应选择能尽量减少停顿时间的垃圾回收器。例如,CMS(Concurrent Mark Sweep)垃圾回收器,它在标记 - 清除算法基础上,尽量减少与用户线程的停顿时间,并发执行部分垃圾回收工作。G1垃圾回收器也能较好地满足响应时间要求,通过将堆划分为多个Region,可预测地控制停顿时间。
- 优化方面,可以通过调整堆大小、新生代与老年代比例、垃圾回收器参数等,来减少停顿时间。例如,增大堆大小可以减少垃圾回收频率,但可能增加每次垃圾回收的时间;合理调整新生代与老年代比例,让对象尽量在新生代被回收,减少晋升到老年代的对象数量。
- 吞吐量:
- 对于注重吞吐量的应用,如批处理任务,可选择Parallel Scavenge(新生代)和Parallel Old(老年代)组合,它们以吞吐量优先,通过多线程并行垃圾回收,能在较短时间内完成垃圾回收工作,提高应用的整体吞吐量。优化时可适当增大堆大小,减少垃圾回收次数以提高吞吐量。