如何快速定位OutOfMemoryError發生的地方和原因

問題

相信你做的項目在日常運行中肯定遇到過OOM,內存不足。什麼?你沒遇到過!那你也得看看,先了解下,以後肯定會遇到的,相信我!

PS. 以下可能會出現一些專業名稱,你瞭解的話還好,不瞭解的話我也不過多解釋,自己百度吧,只說怎麼找問題。

image-20200619112703492

常見解決方案

  1. 重啓項目

  2. 增大項目啓動的內存設置

    《阿里巴巴開發手冊》的建議:我收集的學習資料

    image-20200619150051352

但這些都是治標不治本,項目運行久了還是會出現的;

本着大多數問題都是因爲代碼沒寫好引起的理念,所以問題應該從代碼着手。但具體是哪個方法、哪一行代碼如果日誌裏分析不出來的話,那麼我這篇博客就派上用場了。

診斷流程

  1. 項目運行中發生OOM時,需要導出dump文件用來分析問題,有兩種方式:

    1. 執行此命令:jmap -dump:format=b,file=oom.dump pid ,會生成當前pid進程對應的內存鏡像文件oom.dump

    2. 或者在啓動命令裏配置啓動參數,下次出現OOM時會自動生成oom.dump

      -XX:+HeapDumpOnOutOfMemoryError
      -XX:HeapDumpPath=/log/oom.dump
  2. Windows環境 - 對已導出的dump文件進行分析

    說明:可使用jdk自帶的jvisualvm.exe進行分析,jvisualvm.exe在你自己裝的jdk/bin/jvisualvm.exe目錄下

    1. 打開jvisualvm.exe,選擇文件-裝入,選擇文件類型堆 Dump(*.hprof,**),就可以裝入你的文件了

    2. 裝入後可以看到好多信息

      image-20200619120831992

      image-20200619121046019![image-202

      image-20200619121310897

由上面可以看出數組佔用最大,初步懷疑可能是它佔用內存沒有即時釋放

image-20200619121715496

果然是一直往list中存放數組,不能釋放,結果就OOM了。這是我設置的啓動參數-Xms128m -Xmx256m,所以就可以 試出來。

  1. Linux環境 - 對已導出的dump文件進行分析

    說明:使用Mat工具;因爲導出的dump文件往往都是好幾G,最好的話就在Linux上進行分析了

    1. 下載鏈接https://www.eclipse.org/mat/downloads.php,選擇合適的包就可以,並解壓到Linux裏

    2. 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文件大就可以。
    3. 結果會生成一些文件,找到這三個後綴的壓縮文件,比較小,可下載到本地解壓用瀏覽器查看index.html

      image-20200619141708455

      image-20200619142044838

      image-20200619142314134

發生

看下源碼,java.lang.OutOfMemoryError類爲什麼會拋出這個錯誤

image-20200619145348337

如何避免發生OOM,網上資料很多,我就不贅述了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章