背景:

所在部门整个系统运行正常,但个别机器的内存利用率突然上升,cpu利用率接近100%(因隐私原因不便展示)。出现这种情况后立即让SA帮忙重启,重启后系统又正常了,然后观察此机器一周后再没有发生此问题,突然周一该问题又重现了,领导指示必须尽快解决。请求SA协助dump内存镜像。

解决过程

  1. jmap dump整个内存镜像

  2. 整个文件700多M,使用Jhat打不开

  3. 换heapanalyzer,能打开,但没有分析出占用内存的情况,使用命令:java -Xmx4096m -jar ha39.jar

4.换成Mat eclipse插件,直接打开dump.bin文件(jvm 10g)。mat插件地址:http://download.eclipse.org/mat/1.6/update-site/

跟据mat分析今天上的dump文件,发现大对象是一个String的arraylist,string的内容像是日期,然后搜索整个工程,找出具体方法有一个while语句,在边界测试时会进入死循环,导致内存不断升高,最终heap out of memory。

心得:

1.保留证据,并重启机器是法宝。

2.mat等内存分析工具要求机器的内存及jvm的内存比较大,需要好的配置,台式机最佳。

3.while类似的有无限循环可能的程序一定要慎用,可以使用一个较大的值(业务上)做for循环来替代while。

4.对上线的代码保持敬畏。