如何分析JMeter运行时生成的HPROF格式堆转储文件
JMeter HPROF堆转储文件分析指南
分析工具选择
优先使用Eclipse Memory Analyzer(MAT),这是目前行业内分析堆转储文件的首选工具,没有MAT的情况下也可以使用JDK自带的jhat、jvisualvm工具。
MAT分析操作步骤
- 打开MAT后,点击
File > Open Heap Dump选中生成的.hprof文件,等待工具完成解析(文件较大时需要给MAT分配足够的运行内存) - 解析完成后首先查看默认生成的*Leak Suspects(泄漏嫌疑)*报告,报告直接高亮标注占内存比例最高的大对象和疑似内存泄漏点,JMeter场景下绝大多数OOM问题都可以通过该报告直接定位根因
- 进入
Histogram视图,按类维度统计实例数量和占用内存大小,筛选org.apache.jmeter前缀的类,排查是否是JMeter内置对象占用过高内存:常见异常特征:
SampleResult类实例占总内存30%以上,一般是开启了响应数据全量存储、监听器配置过多导致 - 进入
Dominator Tree视图,按对象保留内存大小排序,定位持有最多内存的根对象,排查是否是自定义脚本的全局变量未释放、第三方JMeter插件存在内存泄漏问题
JDK自带工具快速排查方案
如果暂时无法安装MAT,可以用JDK自带工具做初步定位:
- 使用
jhat:执行命令jhat -J-Xmx4g 你的堆转储文件路径.hprof,命令执行完成后访问本地7000端口即可查看类实例统计、对象引用链信息,注意-J-Xmx4g参数需要根据堆转储文件大小调整,要分配比转储文件更大的内存避免jhat本身OOM - 使用
jvisualvm:打开工具后点击「装入」,选择堆转储文件即可查看直方图、大对象列表、引用链等信息,操作门槛比jhat更低
JMeter OOM常见对应堆转储特征
- 占比最高的大对象为字符串、字节数组,内容对应接口响应数据:属于配置问题,非GUI模式下开启了不必要的响应数据存储、监听器保留了全量采样结果导致
- 大对象为自定义类实例、Groovy脚本上下文对象:属于脚本问题,脚本中创建了大量全局变量未清理,或是Groovy脚本未加编译优化生成了大量代理类
- 大对象为JMeter线程实例、线程上下文对象:属于资源配置问题,设置的并发线程数超出了JMeter分配的堆内存上限,需要调整jmeter启动脚本中的
HEAP参数,调大堆内存到物理内存的50%-70%
内容的提问来源于stack exchange,提问作者user16796989
相关产品推荐
相关产品推荐

