1. 垃圾收集器与三色标记算法深度解析
作为一名长期奋战在JVM性能调优一线的工程师,我经常需要面对各种垃圾收集器选型和参数调优的挑战。今天我想和大家深入探讨ParNew、CMS这两款经典收集器的实现原理,以及它们底层依赖的三色标记算法。这些知识不仅是面试高频考点,更是解决实际生产环境GC问题的关键钥匙。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 垃圾收集算法基础
2.1 分代收集理论
现代JVM垃圾收集的核心思想源于分代假设(Generational Hypothesis)。根据IBM研究表明,98%的Java对象存活时间不超过1毫秒。基于这个观察,HotSpot VM将堆内存划分为:
- 年轻代(Young Generation):存放新创建的对象,采用复制算法
- 老年代(Old Generation):存放长期存活的对象,采用标记-清除或标记-整理算法
这种分区的优势在于可以针对不同生命周期的对象采用最优收集策略。在我的调优实践中,合理设置-XX:NewRatio参数(默认值2,即老年代是年轻代的2倍)对系统性能影响显著。
2.2 复制算法详解
年轻代采用的复制算法将内存分为Eden区和两个Survivor区(默认比例8:1:1)。对象分配流程如下:
- 新对象首先在Eden区分配
- 当Eden区满时触发Minor GC
- 存活对象被复制到Survivor0区,Eden区清空
- 下次Minor GC时,Eden和Survivor0的存活对象复制到Survivor1
- 经过多次GC(默认15次)仍存活的对象晋升到老年代
关键参数:-XX:MaxTenuringThreshold控制晋升阈值,-XX:SurvivorRatio调整Survivor区比例
我曾遇到一个案例:某电商系统在促销时频繁Full GC。分析发现Survivor区过小导致对象过早晋升,调整-XX:SurvivorRatio=6后,老年代压力降低70%。
2.3 标记-清除与标记-整理
老年代通常采用这两种算法:
-
标记-清除:先标记存活对象,然后清除未标记区域
- 优点:不需要移动对象,停顿时间短
- 缺点:产生内存碎片,可能触发提前Full GC
-
标记-整理:标记后将所有存活对象向一端移动
