主题切换
JVM垃圾回收三大算法
一、总述
HotSpot虚拟机共有三种基础垃圾回收算法:标记清除、复制算法、标记整理。虚拟机采用分代收集思想,新生代优先使用复制算法,老年代使用标记整理,CMS并发收集器底层基于标记清除实现。
二、标记清除算法(Mark-Sweep)
1. 执行流程
回收分为标记、清除两个独立阶段:
- 标记阶段:以GC Roots为起点遍历全部引用链,标记堆中所有存活对象;
- 清除阶段:完整遍历堆内存,回收所有未打上存活标记的垃圾对象。
2. 优点
逻辑简单,标记与清除操作执行速度快,底层实现成本低。
3. 缺点
回收完成后堆内存产生大量不连续空闲碎片,空闲空间零散,分配大容量对象时容易提前触发GC。
4. 适用场景
极少单独使用,CMS并发收集器底层核心依赖该算法。
三、复制算法(Copy)
1. 执行流程
将可用内存划分为两块同等大小区域:From区、To区。
- GC阶段标记From区内全部存活对象;
- 将存活对象完整复制到To区域,保证内存连续规整;
- 清空整个From区域,交换From与To的功能角色,本轮回收完成。
2. 优点
- 复制完成后内存无碎片,对象内存分配速度快;
- 新生代对象存活率低、垃圾占比高,复制开销小,回收效率优秀。
3. 缺点
- 内存利用率仅50%,一半内存空间长期闲置;
- 存活对象数量庞大时,复制对象的开销会大幅上升,性能较差。
4. 适用场景
专门用于新生代,HotSpot对新生代做优化,采用Eden+双Survivor结构改良复制算法。
四、标记整理算法(Mark-Compact)
1. 执行流程
分为标记、整理压缩两个阶段:
- 标记阶段:逻辑与标记清除完全一致,标记堆内全部存活对象;
- 整理压缩阶段:将所有存活对象统一向内存一端平移、紧密排列;
- 清理边界外侧全部垃圾,空闲内存统一集中在内存尾部。
2. 优点
回收后不存在内存碎片,分配大对象不会因碎片频繁触发GC,适配长期存活对象。
3. 缺点
需要移动大量存活对象,同时修改所有对象引用地址指向新内存位置,整体执行效率偏低。
4. 适用场景
老年代默认回收算法,老年代对象存活率高,无法使用复制算法。
五、面试简答
问:JVM有哪三种垃圾回收算法,分别介绍流程、优缺点与适用场景?
答:
- 标记清除:先标记存活对象,再清除未标记垃圾。实现简单执行速度快,但会产生大量内存碎片;CMS收集器底层采用该算法。
- 复制算法:内存均分为两块,GC时将存活对象复制到备用区域,回收后无内存碎片,新生代回收效率高;缺点内存利用率仅50%,专门用于新生代。
- 标记整理:标记完成后压缩所有存活对象至内存一端,消除内存碎片,适配老年代;缺点移动对象会带来额外性能损耗。