解決Bug之路:記一次記憶體溢位問題的查詢
JVM記憶體溢位的問題定位一直是個比較棘手的問題,日常開發專案中出現了記憶體溢位的情況,針對這種情況,本次通過分析dump檔案,快速定位問題,實錘Bug的源頭
步驟:
1、檢視日誌檔案
伺服器記憶體溢位報警,通過檢視日誌,初步懷疑查詢的資料過多,造成記憶體溢位。
2、檢視weblogic啟動檔案的配置
檢視weblogic啟動檔案中對jvm的配置,發現有-XX:+HeapDumpOnCtrlBreak,所以應該可以生成java程序某一時間的記憶體快照。
3、查詢Heap Dump檔案
在發生記憶體溢位時,手動生成heap dump 檔案,在weblogic的domain目錄下,找到heap dump檔案。
4、分析Heap Dump檔案
Eclipse下載MAT(Memory Analyzer Tool )外掛,對heap dump檔案進行分析。找到消耗記憶體比較大的執行緒,發現數據庫查出大量資料,放到集合中。
通過分析dump檔案,可以定位到問題程式碼的具體位置,並能獲取當時具體的例項物件,也可以檢視物件中的具體資料,針對問題,快速解決。
總結:
Heap Dump 概述
Heap Dump 是 Java程序所使用的記憶體情況在某一時間的一次快照。以檔案的形式持久化到磁碟中。
Heap Dump的格式有很多種,而且不同的格式包含的資訊也可能不一樣。但總的來說,Heap Dump一般都包含了一個堆中的Java Objects, Class等基本資訊。同時,當你在執行一個轉儲操作時,往往會觸發一次GC,所以你轉儲得到的檔案裡包含的資訊通常是有效的內容(包含比較少,或沒有垃圾物件了) 。
Heap Dump 包含的資訊
所有的物件資訊 :物件的類資訊、欄位資訊、原生值(int, long等)及引用值
所有的類資訊 :類載入器、類名、超類及靜態欄位
垃圾回收的根物件 :根物件是指那些可以直接被虛擬機器觸及的物件
執行緒棧及區域性變數 :包含了轉儲時刻的執行緒呼叫棧資訊和棧幀中的區域性變數資訊
Heap Dump 獲取方式
通過JVM 引數獲取 dump 檔案
-XX:+HeapDumpOnOutOfMemoryError
當OutOfMemoryError發生時自動生成 Heap Dump 檔案
-XX:+HeapDumpOnCtrlBreak
互動式獲取dump。在控制檯按下快捷鍵Ctrl + Break時,JVM就會轉存一下堆快照。
-XX:+HeapDumpBeforeFullGC
當 JVM 執行 FullGC 前執行 dump。Full GC 是清理整個堆空間—包括年輕代和永久代。
-XX:+HeapDumpAfterFullGC
當 JVM 執行 FullGC 後執行 dump
-XX:HeapDumpPath=E:\java-heap\claim\heapdump${current_date}.hprof
指定 dump 檔案儲存路徑。
注意:JVM 生成 Heap Dump 的時候,虛擬機器是暫停一切服務的。
分析dump檔案工具:
eclipse外掛Memory Analyzer Tool