選擇"Open Snapshot",點擊"Open a single Snapshot "加載dump文件.
若dump文件jProfiler無法識別,則可以直接修改後綴,如:*.hprof,*.jps,*.bin等
加載dump文件完成,界面如下:
作者插入,重點關注"Current Object Set" 和"Thread Dump",即:
1.Current Object Set: 確定相關對象,找到對應的線程.
2.在Thread Dump中查找對應的線程,確定方法調用棧,找到具體的業務操作.
言歸正傳,因內存溢出,更多的關注佔內存大小,可以點擊"size"排序,對內存佔用最多的對象進行分析
下面以佔內存最大對象爲例,具體分析
已經訪問到基礎類java.lang.Object[],則此時可以點擊"Biggest Objects",查看佔內存最大對象,即查看剛剛創建的Todo列表,點擊單一對象,爲相關業務對象具體內容.如果對相關業務熟悉,應該已經知道什麼業務的處理對象了.
點擊"show in graph" ,可以通過調用鏈,可以查找到對應的線程棧.
調用鏈截圖,如下:
具體線程調用棧信息
至此,已經找到了相關業務的調用方法,再具體分析相關代碼,找出原因,進行優化即可解決內存溢出問題.
簡單說明:線上問題,因一次性調用過多數據,其列表對象就是Todo對象(大對象),導致加載到內存太大,GC無法及時處理,導致內存溢出.