面试题答案
一键面试分代收集算法基本思路
分代收集算法基于对象的存活周期不同将堆内存划分为不同的代,如新生代和老年代。新生代存放生命周期短的对象,老年代存放生命周期长的对象。垃圾回收时,根据不同代的特点采用不同的垃圾回收算法,这样可以提高垃圾回收效率。因为新生代对象创建和消亡频繁,适合采用复制算法;老年代对象存活率高,适合采用标记 - 整理算法或标记 - 清除算法。
新生代适合的垃圾回收算法及原因
- 复制算法:
- 算法描述:将内存分为大小相等的两块,每次只使用其中一块。当这块内存用完,将存活对象复制到另一块,然后把使用过的内存一次性清理掉。
- 适合原因:新生代对象大多“朝生夕灭”,存活对象少。复制算法只需复制少量存活对象,操作简单高效,且不会产生内存碎片。例如,在一个典型的Web应用中,大量的请求处理过程中会创建许多临时对象,这些对象在请求处理完后很快就不再使用,在新生代采用复制算法能快速回收这些对象占用的内存。
老年代适合的垃圾回收算法及原因
- 标记 - 整理算法:
- 算法描述:首先标记出所有存活对象,然后将存活对象向一端移动,最后清理掉边界以外的内存。
- 适合原因:老年代对象存活率高,如果采用复制算法,需要复制大量存活对象,成本较高。标记 - 整理算法在标记存活对象后,通过整理操作避免了内存碎片的产生,同时不需要大量复制对象,适合老年代特点。比如在一些长期运行的后台服务中,老年代会存放许多缓存对象等长期存活的数据,标记 - 整理算法能有效管理这些对象的内存。
- 标记 - 清除算法:
- 算法描述:先标记出所有存活对象,然后清除未标记的对象。
- 适合原因:老年代对象移动成本高,标记 - 清除算法不需要移动对象,操作相对简单。不过它会产生内存碎片,但在老年代可以通过内存分配策略等方式在一定程度上缓解碎片问题。例如在一些大数据处理场景中,老年代存放大量数据对象,标记 - 清除算法可以快速回收垃圾对象,虽然会产生碎片,但通过合理的内存管理可以继续使用。