Aeron集群空闲时堆内存占用增长的原因咨询
Aeron空闲时堆内存持续增长问题分析
问题背景
我们采用Aeron库开发,在系统完全空闲状态下监控堆内存使用情况,发现堆内存占用量持续增长。相关日志记录及内存监控情况如下:
日志记录
{"log":"the prevVal of Failed attempts to free log buffers is: 0.0 ","stream":"stdout","time":"2022-12-19T04:00:29.992379754Z"} {"log":"we try to get Sender flow control limits, i.e. back-pressure events value and put it as aeron_sender_flow_control_limits__i_e__back_pressure_events ","stream":"stdout","time":"2022-12-19T04:00:29.992383872Z"} {"log":"the currentValue of Sender flow control limits, i.e. back-pressure events is: 36 ","stream":"stdout","time":"2022-12-19T04:00:29.992387994Z"} {"log":"the prevVal of Sender flow control limits, i.e. back-pressure events is: 36.0 ","stream":"stdout","time":"2022-12-19T04:00:29.99239165Z"} {"log":"we try to get Unblocked Publications value and put it as aeron_unblocked_publications ","stream":"stdout","time":"2022-12-19T04:00:29.992395649Z"}
内存监控情况
内存监控图显示:堆内存占用随时间呈持续上升趋势,无明显的GC回收下降阶段,即使系统处于完全空闲状态,增长趋势仍未停止。
可能原因及排查建议
可能原因
- Aeron资源未正确释放:若Publication、Subscription或Aeron实例未在空闲时调用
close()方法,这些资源持有的内存无法被回收,导致堆内存持续占用。 - 自定义监控采集逻辑内存泄漏:日志中显示存在自定义的Aeron指标采集代码,若采集逻辑每次执行都创建新对象(如字符串、集合)且未被GC及时回收,高频采集会导致堆内存缓慢增长。
- Aeron后台线程资源未清理:Aeron的后台清理线程(如BufferCleaner)可能持有未释放的对象引用,或线程本地缓存未清空,导致内存无法回收。
- 日志框架内存开销:若日志输出频率过高,且日志框架配置不当,日志事件对象累积无法回收,也会导致堆内存增长。
- Aeron版本问题:使用的Aeron版本存在已知内存泄漏BUG,旧版本在特定场景下可能出现空闲时内存增长的情况。
排查建议
- 核对Aeron资源生命周期:确认所有Aeron相关资源在系统空闲时已完全关闭释放。
- 抓取堆内存快照:使用
jmap、JProfiler等工具分析堆内存,定位占比最高的对象类型,确定内存增长来源。 - 检查监控采集代码:梳理自定义指标采集逻辑,排查是否存在重复创建对象、未释放资源的情况。
- 升级Aeron版本:切换至官方最新稳定版本,验证是否存在版本相关的内存泄漏问题。
- 优化日志配置:调整日志输出频率,检查日志框架是否存在对象累积未回收的情况。
内容的提问来源于stack exchange,提问作者Masoud Basirati
相关产品推荐
相关产品推荐

