java OOM(OutOfMemory) 问题分析

偶然在工作中有发现部署的应用有内存溢出问题,所以抽空补充了一下这些方面的知识。

内存溢出我们可以通过heapDump来分析到底是那个对象吃掉过多内存或者那个类的实例过多等原因而导致。

因而我们首先要做的就是获取heapDump,我这里使用两种方式获取:

1. 因为部署的是web应用,所以在tomcat以及weblogic等服务器上都有针对内存溢出的处理方式,这种处理方式很简单,只需在JAVA_OPTIONS选项增加

    -XX:+HeapDumpOnOutOfMemoryError 即可,增加了这个配置,当抛出内存溢出异常时,会自动将当前JVM所使用的内存数据dump到当前目录下,输出的文件名格式:

    java_pid<真实的pid,这里是tomcat的进程号>.hprof。 我们在配置JAVA_OPTIONS时也可指定这个dump文件的输出路径,只需要再增加一个配置项即可:

 -XX:HeapDumpPath=file_path。

2. 也可以直接使用jdk自带的jmap工具来打heapDump. 使用很简单:jmap -dump:format=b,file=


通过上述两种方法我们获取了heapDump文件,然后我们需要通过辅助工具来帮助我们进行分析。这里通过两种常用工具来分析dump文件。

1. 可以通过Java jdk自带的jhat工具来分析。直接执行:jhat -J-Xmx500m -port 7000 。端口默认7000, 可以不需要设置。

    执行后的结果如下:

    

    在执行完上述命令后,直接通过浏览器访问:http:// :7000来查看分析结果。

    

2. 可以使用IBM的heapanalyzer工具。使用非常简单,图形化显示,推荐使用。

    首先,我们需要下载这个工具包,然后执行: java -Xmx1000m -jar ha442.jar , 执行命令后会自动打开图形化界面(如果在linux环境下,需要安装图形化显示端)。如下图:


你可能感兴趣的:(Java)