一次OOM的排查過程

最近測試環境的Java應用常常掛掉,用jconsole查看堆內存使用狀況,以下圖:web

堆內存使用量

在達到高峯的時候tomcat服務掛了,看圖能夠知道使用內存過大,因而開始追蹤元兇。數據庫

  1. 加入啓動參數 在catalina.sh加入-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/web/tomcat7/temp/oom.hprof 第一個參數是當發生OOM是生成heap dump文件,第二個參數是指定文件路徑
  2. MAT工具分析 將生成的oom.hprof載入MAT進行分析(MAT工具下載地址:迅雷下載連接),以下圖:

MAT分析圖

工具怎麼使用在此不講了,參考官網wiki介紹。 點擊圖中Reports 下的 Leak Suspects,這裏會列出了工具懷疑的內存泄露點,不過工具懷疑的也未必真的是存在的,但提供了一種參考。以下圖:tomcat

懷疑的內存泄露點

圖中懷疑內存泄漏點有四處,點擊圖中第一處的details查看詳細狀況,以下圖:工具

內存泄露點1

從圖中能夠看到一個ArrayList有240097個對象引用沒有釋放掉,這纔是致使OOM的緣由,再查看報告中的Thread Stack,找到具體代碼所在處,以下圖:Thread Stack 通過排查,原來是程序代碼一次性從數據庫加載了所有的數據,沒有分頁致使的,修改完代碼後一切正常了~~測試

相關文章
相關標籤/搜索