更新时间:
#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 |
|---|