Spring Integration使用Aggregator出现内存泄漏问题咨询
Spring Integration Aggregator堆内存占用居高不下排查点
- SimpleMessageStore已完成组缓存溢出(最高概率)
哪怕你设置了expireGroupsUponCompletion=true,SimpleMessageStore内部默认会维护一个无限大小的completedGroups集合,用来存储已经处理完成的消息组ID,避免重复消息被再次归组处理。压测场景下每个请求批次对应唯一的correlation key,这个集合会随着请求量持续增长且没有自动淘汰逻辑,是内存只涨不跌的最常见原因。
修复方案:构造SimpleMessageStore时调用setCapacityLimit(int capacity)方法,设置合理的已完成组缓存上限,超出阈值后会自动淘汰最早的缓存记录,不会影响正常业务的去重逻辑。 - 业务逻辑持有消息对象引用
如果你在Aggregator的自定义处理方法中将消息、消息体对象存放到了长生命周期的容器中(比如静态集合、全局缓存、ThreadLocal没有主动清理),就算消息组被销毁,对象也不会被GC回收。你可以通过JProfiler、MAT等内存分析工具抓取堆快照,排查大对象的引用链是否来自业务代码的持有。 - MessageGroupStoreReaper配置未生效
首先确认Reaper实例绑定的MessageGroupStore就是Aggregator使用的实例,避免多实例配置下Reaper扫不到目标存储;其次检查Reaper的调度线程池配置是否正常,有没有出现任务阻塞、执行报错的情况,导致过期组没有被及时清理。 - 不完整消息组隐式残留
你使用的SimpleSequenceSizeReleaseStrategy依赖splitter生成的sequenceSizeheader判断组是否完整,如果压测过程中出现消息丢失、correlation key重复、sequence header被篡改的情况,会产生永远达不到释放条件的残组。你可以在压测过程中每隔10秒调用一次MessageGroupStore.getMessageGroupCount(),确认是否有持续增长的未完成组计数。
内容的提问来源于stack exchange,提问作者Sefa Mert Kaya
相关产品推荐
相关产品推荐

