RocketMQ:底层Netty频繁OS OOM

简介: 某核心应用出现少量机器OOM被杀,排查发现容器内存8G,JVM堆4G、MaxDirectMemorySize设为1G,但实际RSS远超预期。通过NMT定位到“Other”内存持续增长,结合Arthas发现7个不同ClassLoader加载了Netty的PooledByteBufAllocator,每个独立占用堆外内存,导致总使用量突破1G限制。其中rocketmq-client实例几乎占满1G,最终确认为多ClassLoader引发的堆外内存超额使用问题。

某核心应用的负责同学反馈应用存在少量机器OOM被OS kill的问题。看sunfire监控信息,的确如此。

初步收集到的信息:
容器内存=8G,Java 11,G1 GC=4G,MaxDirectMemorySize=1G。详见下图:

业务同学已经做过Java dump,可以看到堆外对象几乎没有,堆内的使用量也不大,<3G。上机器查看Java进程的内存使用量的确很大:

通过目前掌握到的信息来看,4G(Java堆)+1G(堆外)+512M(元空间)+250M(CodeCache)+其它,离6.8G还是有不少差距,无法简单的明确原因,需要深入排查分析了。
问题结论
省流版
中间件中多个不同的ClassLoader加载了多个netty的io.netty.buffer.PooledByteBufAllocator,每一个都有1G的内存配额,所以存在实际使用的堆外内存超出1G限制的问题。
通过Arthas可以看到存在这个类的7个不同的实例:

而其中rocketmq-client的这一个,已经基本用完1G的内存(其它几个使用量大多在100多M的样子):

详细版
中间件中多个不同的ClassLoader加载了多个netty的io.netty.buffer.PooledByteBufAllocator,每个Allocator都用自己的计数器在限制堆外内存的使用量,这个限制值大多数情况下取值至MaxDirectMemorySize,所以会存在无法限制堆外内存使用量在1G以内的问题。
这个应用是饿了么弹内的应用,io.netty.buffer.PooledByteBufAllocator,有7个ClassLoader加载了它,分别:
● sentinel's ModuleClassLoader:流量监控软件
● rocketmq-client's ModuleClassLoader:消息中间件
● tair-plugin's ModuleClassLoader:云数据库
● hsf's ModuleClassLoader:远程调用(类似dubbo)
● XbootModuleClassLoader
● pandora-qos-service's ModuleClassLoader:类似springboot
● ele-enhancer's ModuleClassLoader
相比弹内应用的4个(数据来自淘天集团的核心应用ump2,如下图),多了3个。

在Java8,以及Java11中(JVM参数设置了-Dio.netty.tryReflectionSetAccessible=true过后),netty会直接使用unsafe的方法申请堆外内存,不通过Java的DirectMemory分配API,所以通过监控看不到堆外内存的占用量,也不受JVM MaxDirectMemorySize的管控。
查看DirectByteBuffer实现代码可以发现,它限制MaxDirectMemorySize的方法是在Java层(代码标记处1),实际上在JVM底层是没有任何限制的,netty是直接用了这里代码标记处2的API分配内存。
排查过程
1.1.通过NativeMemoryTracking看Native内存的占用分布
通过在JVM参数上加上-XX:NativeMemoryTracking=detail,就可以打印出详细的内存分类的占用信息了,观察了一整天,发现主要的可疑变化是在Other部分,即堆外的部分,如下图。( Java NMT的详细使用可以参考相应的技术文章)

明明是限制的堆外1G,怎么超过了这么多。再多观察一会,发现它还会继续缓慢上涨的,最高达到接近1.5GB。这就和最开始查看Java进程的RSS占用对上了。

相关文章
|
12天前
|
数据采集 人工智能 安全
|
7天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
344 164
|
6天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
345 155
|
7天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
573 4
|
15天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
1013 7