主题切换
一、总述
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. 适用场景
专门用于新生代(Eden+Survivor优化版复制算法)。
四、标记整理算法(Mark-Compact)
1. 执行流程
分为标记、整理两个阶段:
- 标记阶段:和标记清除完全一致,标记全部存活对象;
- 整理压缩阶段:将所有存活对象统一向内存一端平移压缩,紧密排列;
- 清理边界以外全部垃圾,空闲空间集中在内存尾部。
2. 优点
回收后无内存碎片,大对象分配不会因碎片频繁触发GC,适合长期存活对象。
3. 缺点
需要移动大量存活对象,并修改所有引用地址指向新内存位置,整体执行效率偏低。
4. 适用场景
老年代默认回收算法,老年代对象存活率高,不适合复制算法。
五、面试简答
问:JVM有哪三种垃圾回收算法,分别介绍流程、优缺点与适用场景?
答:
- 标记清除:先标记存活对象,再清除垃圾。实现简单速度快,但产生大量内存碎片;CMS收集器底层使用。
- 复制算法:内存均分两块,存活对象复制到备用区,无碎片,新生代效率高;缺点内存利用率只有50%,用于新生代。
- 标记整理:标记后压缩存活对象到内存一端,消除碎片,适合老年代;缺点移动对象带来额外性能损耗。