蚂蚁消息中间件 (MsgBroker) 在 YGC 优化上的探索
GC 一直是 Java 应用中被讨论得最多的话题之一,尤其对于消息中间件这样的基础应用,GC 停顿产生的延迟会严重影响其在线服务能力,是开发和运维人员关注的重点。 关于 GC 优化,首先最容易想到的就是调整那些影响 GC 性能的 JVM 参数(如新生代与老年代的大小、晋升到老年代的年龄、甚至是 GC 回收器类型等),使得老年代中存活的对象数量尽可能的少,从而降低 GC 停顿时间。然而,除了少数较为通用的参数设置方法可以参照和遵循,在大部分场景下,由于不同应用所创建对象的大小与生命周期不尽相同,GC 参数调优实际上是个非常复杂且极具个性化的工作,并不存在万能的调优策略可以满足所有的场景。同时,由于虚拟机内部已经做了很多优化来尽量降低 GC 的停顿时间,GC 参数调优并不一定能达到预期的效果,甚至很可能适得其反。 抛开被老生常谈的 GC 参数调优,本文将通过讲述蚂蚁消息中间件(MsgBroker) 的 YGCT 从 120ms 优化到 30ms 的历程,并从中总结出较为通用的 YGC 优化策略。 背景 谈到 GC,很多人的第一反应是 JVM 长时间停顿或 FGC 导致服务长时间不可用,但对于 MsgBroker 这样的基础消息服务而言,对 GC 停顿会更加敏感,需要解决的 GC 问题也更加复杂: 对于普通应用,如果 YGC 耗时在 100ms 以内,一般是无需进行优化的。但对于