1. dump heap:
如果Java应用程序出现了内存泄露,千万别着急着把应用杀掉,而是要保存现场。如果是互联网应用,可以把流量切到其他服务器。保存现场的目的就是为了把 运行中JVM的heap dump下来。
JDK自带的jmap工具,可以做这件事情。它的执行方法是:
jmap -dump:format=b,file=heap.bin <pid>
sudo jmap -F -dump:format=b,file=heap.bin <pid>
2.使用MAT查看堆内存结构:
安装完MAT后,进入MAT的Perspectives视图,通过File > Open Heap Dump...打开heapDumps文件,就可以看到MAT给出了overview page。
打开过程中有个提示,选择默认的第一个,即,内存错误推断模式:
Shortest Paths To the Accumulation Point
根据上面提示找到占用内存最多的结构,一般是map.
然后,根据项目源码查看逻辑及未释放的原因。