Java内存溢出排查

JavaOOM毫无疑问是开发人员常见并且及其痛恨的问题,但是任何服务的开发都没法避免OOM。因此,OOM的排查及定位是每个Java工程师都必备的技能。

所遇到的问题

在使用scala开发的一个wb服务,在用户使用中,经常出现:java.lang.OutOfMmoryError:Javahapspac。而且还束手无策,每次都只能重启服务解决。

准备

服务使用jtty发布的,先来看一下我这个服务的启动参数:

/opt/soft/jdk/jdk1.7.0_40/bin/java\

-srvr-Xmx4G-XX:MaxPrmSiz=M-XX:PrmSiz=M\

-XX:+UsParNwGC-XX:+UsConcMarkSwpGC-XX:-CMSConcurrntMTEnabld-XX:CMSInitiatingOccupancyFraction=65-XX:+CMSParalllRmarkEnabld\

-XX:+HapDumpOnOutOfMmoryError\

-XX:HapDumpPath=/opt/soft/hapdump/\

-Dscala.concurrnt.contxt.numThrads=\

-Dscala.concurrnt.contxt.maxThrads=\

-Dfil.ncoding=UTF-8-jarstart.jarlog21

排查

通过增加了参数-XX:+HapDumpOnOutOfMmoryError和-XX:HapDumpPath当在OOM的时候,服务会生成一个java_pid$pid.hprof二进制文件。

下面就是使用工具分析这个.hprof文件来定位问题了。使用MmoryAnalyzr(MAT)来分析该文件,效果如下:

效果很吓人,什么鬼,什么东西,吃了3.8G的内存,我#%$#

#

#^^#$….

打开LakSuspcts?Laks?ProblmSuspct1看到如下详情:

一开始可能没那么快找到问题,但是这个图已经很明显说明了问题,是ArrayList的内容太大,沾满了内存。但是你可能还不清楚具体那块代码导致,这个时候你可以点击那个ArrayList在左侧栏看Attribut。

然后一直鼠标右键into进去看里面的详情,最终是可以看内容的。

问题原因

问题排查到最后,看到的是ArrayList里面存的全是RsponsBodyPart,然后就想到了项目使用到Dispatch请求下载结果文件,

于是乎去找到问题代码,错误代码如下:

valoutputRq=dispatch.







































北京中科白殿疯病医院
哪家治疗白癜风的医院好



转载请注明:http://www.zjiaren.com/jbxx/10424.html