使用mat 分析tomcat 内存溢出(OutOfMemoryError: Java heap space)
由于没有进行压力测试,网站运行过程中,随着数据量增大,tomcat 报OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题。我们需要找造成OutOfMemoryError原因。一般有两种情况:
1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;
2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。甚至优化代码减少临时变量的产生。
以上是处理Java堆问题的思路,具体是怎么进行分析,这里介绍的是使用Eclipse Memory Analyzer tool(MAT)工具分析的过程。
2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。甚至优化代码减少临时变量的产生。
以上是处理Java堆问题的思路,具体是怎么进行分析,这里介绍的是使用Eclipse Memory Analyzer tool(MAT)工具分析的过程。
生成dump文件
通过jvm参数--XX:+HeapDumpOnOutOfMemoryError可以让JVM在出现内存溢出是Dump出当前的内存转储快照。
-XX:HeapDumpPath=${目录}参数表示生成DUMP文件的路径,如不设置,默认存储在jvm 运行环境目录。如我们这使用的是tomcat 默认dump文件存储在 tomcat/bin 目录下。也可以指定文件名称,如果不指定文件名,默认文件示例如
下:java_pid2821.hprof,其中2821为Java进程号。
上面的参数是设置内存溢出时,dump 转储出内存影像。也可以手工导出来随时分析。但各厂商的jvm 手工dump 方法有小区别,具体可以根据自己jvm 型号google。如 Oracle JVM的6.0版本去掉了-XX:+HeapDumpOnCtrlBreak参数(-XX:+HeapDumpOnCtrlBreak参数表示可以通过kill -3 <pid>根据需要产生DUMP文件),如果需要产生DUMP文件,请采用jmap命令,命令行格式如下:
jmap -dump:format=b,file=managed1_heapdump.hprof <pid>
其中managed1_heapdump.hprof表示生成的DUMP文件名称,pid表示Java进程号(win通过任务管理器查看tomcat的进程pid,linux用ps命令查看进程pid)。
ps: myeclipse 如何设置tomcat运行时java 参数呢。
内存转储以后就是使用mat 进行分析了。