1. 程式人生 > >解決Bug之路:記一次記憶體溢位問題的查詢

解決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