背景
相信有不少人遇到过线上业务出现问题,为排查导出线上业务堆栈,但是最后发现导出的堆栈文件过大,少则2-3G,多则10GB大小,无法直接分析,这时候有点束手无策。本期的文章,就以如上描述的场景为例子,简单介绍下对于超大的堆栈,如何进行堆栈分析,获得
我们需要的现场数据。
分析
导出堆栈
添加启动参数,在内存溢出时导出
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=xxx.hprof
手动导出
jmap -dump:live,format=b,file=xxx.hprof <PID>
分析堆栈
常见的分析工具有如下的几种:
- jvisualvm
这个是JDK自带的工具,可以通过图形化界面查看,可以在jdk的bin目录下找到。但是这个工具只适合较小堆栈分析。 - jhat
可以通过jhat -J-Xmx5120m xxx.hprof
来进行分析,执行后会产生一个Web服务,然后可以通过这个web服务查看具体的堆栈情况。但是经过实际测试,在本地的堆栈是4GB大小的时候,依然无法打开,会报OOM错误。
在找了内存为32G的机器后,可以执行成功,但是堆栈分析中histogram部分依然无法打开。因此,这种,在面对超大的堆栈的时候,依然无法满足我们的需求。 - eclipse MAT
这里分两部分,对于较小的堆栈,可以使用其图形化界面的软件直接分析,而重点是对大堆栈的分析过程。
在下载该软件,解压完成后。可以在执行目录发现MemoryAnalyzer.ini,可以修改其中的配置,增大内存配置。根据实际使用的经验,和要分析的堆栈大小差不多即可以。
然后执行如下的命令:
./ParseHeapDump.sh xxx.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
如果堆栈较大,这个执行时间会比较长,实际使用约4G的堆栈,执行实际在5分钟左右。完成后会得到一些文件,其中包括三个ZIP格式的分析报告,分别是m_Leak_Suspects.zip, m_System_Overview.zip, m_Top_Components.zip
解压后就可以获得对应的分析报告,然后可以使用浏览器直接打开里边的index.html浏览。

因本次分析未保存图片以及部分数据不适宜公开,使用https://www.codenong.com/cs106586557的实例图片
这个分析报告也可以用MAT打开。
总结
以上就是本期的内容,最后提两点。一个是日常应该尽量避免配置大堆栈,这种一旦出现问题还是不好分析的,像业务应用这种,如果采用容器的集群部署,一方面能优化资源使用,一方面也能避免大堆栈,降低运维成本。第二点呢,堆栈分析属于事后分析,如果能提供足够的日志和监控告警,提前发现问题,或许就能减少因意外故障造成的损失。
网友评论