問題
相信你做的項目在日常運行中肯定遇到過OOM,內存不足。什麼?你沒遇到過!那你也得看看,先了解下,以後肯定會遇到的,相信我!
PS. 以下可能會出現一些專業名稱,你瞭解的話還好,不瞭解的話我也不過多解釋,自己百度吧,只說怎麼找問題。
常見解決方案
-
重啓項目
-
增大項目啓動的內存設置
《阿里巴巴開發手冊》的建議:我收集的學習資料
但這些都是治標不治本,項目運行久了還是會出現的;
本着大多數問題都是因爲代碼沒寫好引起的理念,所以問題應該從代碼着手。但具體是哪個方法、哪一行代碼如果日誌裏分析不出來的話,那麼我這篇博客就派上用場了。
診斷流程
-
項目運行中發生OOM時,需要導出dump文件用來分析問題,有兩種方式:
-
執行此命令:jmap -dump:format=b,file=oom.dump pid ,會生成當前pid進程對應的內存鏡像文件oom.dump
-
或者在啓動命令裏配置啓動參數,下次出現OOM時會自動生成oom.dump
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/log/oom.dump
-
-
Windows環境 - 對已導出的dump文件進行分析
說明:可使用jdk自帶的jvisualvm.exe進行分析,jvisualvm.exe在你自己裝的jdk/bin/jvisualvm.exe目錄下
-
打開jvisualvm.exe,選擇文件-裝入,選擇文件類型堆 Dump(*.hprof,**),就可以裝入你的文件了
-
裝入後可以看到好多信息
![image-202
-
由上面可以看出數組佔用最大,初步懷疑可能是它佔用內存沒有即時釋放
果然是一直往list中存放數組,不能釋放,結果就OOM了。這是我設置的啓動參數-Xms128m -Xmx256m,所以就可以 試出來。
-
Linux環境 - 對已導出的dump文件進行分析
說明:使用Mat工具;因爲導出的dump文件往往都是好幾G,最好的話就在Linux上進行分析了
-
下載鏈接https://www.eclipse.org/mat/downloads.php,選擇合適的包就可以,並解壓到Linux裏
-
MAT分析 dump,該命令會執行一段時間
./ParseHeapDump.sh oom.dump org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components #使用該命令如果報MAT內存不足的異常: #修改MemoryAnalyzer.ini 的 -Xmx,默認是1024m,大小比dump文件大就可以。
-
結果會生成一些文件,找到這三個後綴的壓縮文件,比較小,可下載到本地解壓用瀏覽器查看index.html
-
發生
看下源碼,java.lang.OutOfMemoryError類爲什麼會拋出這個錯誤
如何避免發生OOM,網上資料很多,我就不贅述了。