更新时间:

#JVM OOM & JAVA finalizer 引发的 OOM & Thread.stop

#Abstract

这个文章里面会描述以下几件事情:

1. 在Java中有OOM应该怎么分析?
2. Java finalizer为什么会引发OOM?
3. 为什么不能使用Thread.stop

#Java中发生OOM应该怎么分析

大多数时候Java都做得足够好. 但是没办法还是有可能会有OutOfMemoryError(OOM) 发生. 那么我们应该怎么分析一个OOM错误呢?

#拿到内存转储

方式1:自动转储

当OOM发生时, Java可以自动尝试(best effort)生成一个堆转储.只需要你在启动参数中加上如下参数:

1 -XX:+HeapDumpOnOutOfMemoryError

这种方式生成的文件会在java的工作目录里面, 名字叫 java_pidXXX.hprof

方式2:手动转储

有时候你已经可以发现某个Java进程占用了很多内存了. 是时候手动导出一个堆内存了.
使用jmap. jmap是一个jdk自带的工具, 在jdk/bin下面,

1 2 jmap -dump:format=b,file=heap.bin jmap -F -dump:format=b,file=heap.bin 强制导出

有一点很重要: 出于兼容性考虑,一定使用和你运行JRE**运行版本相同**的jmap工具.

http://www.importnew.com/25522.html

再推荐个工具, Jstack分析

IBM Thread and Monitor Dump Analyzer for Java