不喜欢看文字可以看视频:OOM
已知发生OOM了。并且是内存泄漏导致,提示可以减少大量的排查过程。
内存泄漏导致的OOM,我们直接查看堆快照文件即可。
我们看到启动参数中存在XX:+HeapDumpOnOutOfMemoryError
那么当发生OOM时已经生成了,如果启动参数中没添加也没问题,执行jmap -dump:live,format=b,file=XXX.bin <pid>
也可以生成堆快照文件。
-
打开MAT(Eclipse Memory Analyzer),打开堆快照文件。
image.png
-
看下
Dominator Tree
. (The Dominator Tree lists the biggest objects.)
image.png
-
看到第一条占用97%,就可以确定是他的问题了。继续下钻看到是个ArrayList的问题。如果熟悉代码的同学这个时候就能定位到问题了。如果不熟悉我们继续。
image.png
-
看下是谁引用了这变量。操作如图:
image.png
- 查看后找到变量名为
OOM_REASON
的ArrayList即可。
image.png
还有其他工具和方法可以定位到这个问题。比如jhat, jvisualvm。以后有机会都会介绍的,本练习是个定位OOM比较简单的场景,后面逐渐做些复杂点的,先留个坑。
网友评论