如何解读jeprof输出?Oracle JDK下Tomcat原生内存泄漏排查求助
Java应用非堆内存持续增长排查记录
问题现象
- 排查Java相关内存泄漏问题过程中,发现服务器空闲内存持续下降,最终触发通过Nagios配置的RAM告警
- 初步核查确认内存泄漏不属于堆内存区域,但Tomcat进程的整体内存占用仍持续增长
- 部署场景为EC2实例,单实例仅运行当前Tomcat应用,服务器总物理内存为4GB
- 已留存排查过程参考资料:7天服务器整体内存趋势截图、7天应用堆内存占用趋势截图
已开展的排查动作
- 堆内存泄漏专项排查:对堆内存开展全量分析未发现异常对象堆积,执行
jcmd <pid> GC.run命令后,堆内存占用从2.8GB下降至约200MB,可排除堆内存泄漏的可能性 - JVM关联内存区域全量核查:对照公开技术资料逐一核对Metaspace及其他JVM关联内存区域,未发现异常内存占用,参考核查资料包括JVM原生内存泄漏排查主题技术讲解、开源原生内存泄漏排查流程文档
- 原生内存 profiling 接入:为定位原生内存分配异常,接入jemalloc开展原生内存数据采集,目前已采集到两份jeprof格式的输出结果
- 当前存在的待解决问题:无法解读jeprof输出内容,也无法确认采集结果的准确性;同时待验证核心疑问:jeprof是否可适配Oracle JDK完成原生内存数据采集?
排查环境配置明细
- JVM启动参数:设置Xmx=3072M、Xms=3072M(此前将Xmx/Xms调整为2048M配置时,应用内存持续增长的表现与当前完全一致)
- JDK版本信息:采用
jdk1.8.0_72,对应官方版本为Java(TM) SE Runtime Environment (build 1.8.0_72-b15)、Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode) - jemalloc配置信息:采用jemalloc 5.2.1版本,profiling采集环境配置如下:
- 动态库预加载配置:
export LD_PRELOAD=/usr/local/lib/libjemalloc.so - 采集参数配置:
export MALLOC_CONF=prof:true,lg_prof_interval:31,lg_prof_sample:17,prof_prefix:/opt/jemalloc/jeprof-output/jeprof
- 动态库预加载配置:
内容的提问来源于stack exchange,提问作者Thuwan
相关产品推荐
相关产品推荐

