人的天职在勇于探索真理。——尼古拉·哥白尼
服务报出如下错误:
nested exception is java.lang.OutOfMemoryError: Java heap space] with root cause
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
看服务监控:
可用的内存变成0kB了,以前服务是正常的,猜测出现内存泄露。使用Eclipse MAT工具进行分析。
由于服务器限制下载文件大小为50M,dump出来的文件一般都比较大。就算能下载,传输几十G文件效率比较慢。所以使用Linux MAT工具先将文件分析完生成html文件,只有几百K,然后下载到本地用浏览器打开分析。
首先使用下面命令找到服务的pid:
jps -l
然后dump出此服务的堆。
jmap -dump:format=b,file=hummer.dump PID
format=b,表示以字节的形式。文件名为hummer.dump。
首先查看服务器信息:
uname -m
然后下载对应版本的MAT,具体版本可以看官网(https://www.eclipse.org/mat/downloads.php)
wget http://eclipse.stu.edu.tw/mat/1.9.0/rcp/MemoryAnalyzer-1.9.0.20190605-linux.gtk.x86_64.zip
unzip MemoryAnalyzer-1.9.0.20190605-linux.gtk.x86_64.zip
修改MAT的内存大小大于dump出来的文件大小
vi MemoryAnalyzer.ini
./ParseHeapDump.sh hummer.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
生成3个zip文件,hummer_Leak_Suspects.zip、hummer_System_Overview.zip、hummer_Top_Components.zip。把这三个文件下载到本地用浏览器打开,这三个文件很小,只有几百K。
从hummer_Leak_Suspects可以看出如下信息:
点开详情:
可以看到ArrayList占用了89.84%的内存,再具体到类的代码,进行分析。我这边是因为将同步driver改成异步阻塞之后,查询数据太多将ArrayList撑爆了。具体结合三个文件分析。