1. 程式人生 > >使用 mat 進行堆轉儲檔案分析

使用 mat 進行堆轉儲檔案分析

在實際開發中或多或少我們都會遇到java的記憶體問題,特別是開發android程式和大型 JAVA 應用程式來說,再精細的測試也難以堵住所有的漏洞,即便我們在測試階段進行了大量卓有成效的工作,很多問題還是會在生產環境下暴露出來,並且很難在測試環境中進行重現。JVM 能夠記錄下問題發生時系統的部分執行狀態,並將其儲存在堆轉儲 (Heap Dump) 檔案中,從而為我們分析和診斷問題提供了重要的依據。

通常記憶體洩露分析被認為是一件很有難度的工作,一般由團隊中的資深人士進行。不過,今天我們要介紹的 MAT(Eclipse Memory Analyzer)被認為是一個“傻瓜式“的堆轉儲檔案分析工具,你只需要輕輕點選一下滑鼠就可以生成一個專業的分析報告。和其他記憶體洩露分析工具相比,MAT 的使用非常容易,基本可以實現一鍵到位,即使是新手也能夠很快上手使用。

上一篇檔案我們已經順利在myeclipse上安裝了mat外掛並生成了.hprof檔案。這裡我們將主要看看這個分析報告怎麼看,本人也是第一次使用,如果有什麼不對的地方還請不吝指正



重啟後提示安裝成功


再次雙擊開啟.hprof檔案可以看到


通過上面的概覽,我們對記憶體佔用情況有了一個總體的瞭解。先檢查一下 MAT 生成的一系列檔案。


接下來我們就可以來看看生成的報告都包括什麼內容,能不能幫我們找到問題所在吧。您可以點選工具欄上的 Leak Suspects 選單項來生成記憶體洩露分析報告,也可以直接點選餅圖下方的 Reports->Leak Suspects 連結來生成報告。


下面開始分析報告,一般三個步驟:

1.檢視整體的記憶體狀況,先看Leak Suspects(可疑洩漏點圖)


從圖中可以看到有個佔了52兆記憶體的物件,物件是一個map。為什麼會一個map佔據了系統52m的記憶體,誰阻止了垃圾回收機制對它的回收,接下來點選

2.分析原因找到問題所在,首先我們簡單回顧下 JAVA 的記憶體回收機制,記憶體空間中垃圾回收的工作由垃圾回收器 (Garbage Collector,GC) 完成的,它的核心思想是:對虛擬機器可用記憶體空間,即堆空間中的物件進行識別,如果物件正在被引用,那麼稱其為存活物件,反之,如果物件不再被引用,則為垃圾物件,可以回收其佔據的空間,用於再分配。
在垃圾回收機制中有一組元素被稱為根元素集合,它們是一組被虛擬機器直接引用的物件,比如,正在執行的執行緒物件,系統呼叫棧裡面的物件以及被 system class loader 所載入的那些物件。堆空間中的每個物件都是由一個根元素為起點被層層呼叫的。因此,一個物件還被某一個存活的根元素所引用,就會被認為是存活物件,不能被回收,進行記憶體釋放。因此,我們可以通過分析一個物件到根元素的引用路徑來分析為什麼該物件不能被順利回收。如果說一個物件已經不被任何程式邏輯所需要但是還存在被根元素引用的情況,我們可以說這裡存在記憶體洩露。
現在,讓我們開始真正的尋找記憶體洩露之旅,點選“Details ”連結,可以看到如下圖圖所示對可疑物件 1 的詳細分析報告。

可以看到程式有大量的map元素沒有被釋放。這個資訊足夠我們去原始碼裡面需找原因了。 3.檢視原始碼分析錯誤,這個例子的錯誤很明顯,不分析了

相關推薦

使用 mat 進行檔案分析

在實際開發中或多或少我們都會遇到java的記憶體問題,特別是開發android程式和大型 JAVA 應用程式來說,再精細的測試也難以堵住所有的漏洞,即便我們在測試階段進行了大量卓有成效的工作,很多問題還是會在生產環境下暴露出來,並且很難在測試環境中進行重現。JVM 能夠記

使用 Eclipse Memory Analyzer 進行檔案分析

概述 對於大型 JAVA 應用程式來說,再精細的測試也難以堵住所有的漏洞,即便我們在測試階段進行了大量卓有成效的工作,很多問題還是會在生產環境下暴露出來,並且很難在測試環境中進行重現。JVM 能夠記錄下問題發生時系統的部分執行狀態,並將其儲存在堆轉儲 (Heap Dum

檔案分析

第一部,獲取java進車id,命令: jps -v 第二步,匯出堆轉儲檔案,jmap命令: jmap-dump:format=b,file=/data/creditCPA-Tomcat/logs/heap.hprof pid 第三步:分析工具: JVM虛擬機器可

Java分析系列之六:JVM Heap Dump(檔案)的生成和MAT的使用

前面的文章詳細講述了分析Thread Dump檔案,實際在處理Java記憶體洩漏問題的時候,還需要分析JVM堆轉儲檔案來進行定位。 目錄 [隱藏] JVM Heap Dump(堆轉儲檔案)的生成 正如Thread Dump檔案記錄了當時JVM中執行緒執行的情況一樣,He

虛擬機器快照生成以及分析

  通過程式生成的dump檔案來分析故障原因所在。本文給大家展示堆轉儲快照生成以及分析過程。   第一種:使用暴力手段來生成dump檔案— -XX:+HeapDumpOnOutOfMemoryError引數   測試的類如下:

利用WinDbg分析C#程式產生的檔案

 何志丹 啟動對應版本(X86,X64)的WinDbg,主選單“File->Open Crash dump”開啟崩潰轉儲檔案。假定崩潰的程式是Eholly。依次執行以下4命令。 ld Eholly sxe ld:clrjit .loadby sos clr !dum

HeapDumpOnOutOfMemoryError實踐和一些分析

程式碼1在迴圈中建立long[]例項時,上次迴圈建立的long[]例項沒有被引用,可以被垃圾回收掉,所以在引數Xmx40m下,程式碼1建立佔用32M記憶體的long[]還是可以正常執行的,試圖建立佔用64M記憶體的long[]才丟擲異常;程式碼2在迴圈中建立long[]例項時,上次迴圈建立的long[]例項還

得到當前系統的檔案的兩種方法

  一種方法是通過使用者態下winDBG偵錯程式。winDBG的命令.dump,可以通過核心除錯會話來讀取被除錯系統的狀態資訊和記憶體資料,並以正常的格式輸出到指定的檔案中。命令的格式為 .dump c:\mydump.dmp 如果希望得到完全記憶體轉儲,則需要在檔名前加上

Oracle匯入:檔案可能是原始的匯出檔案

問題描述: C:\Users\Administrator>impdp olap_ft2013/[email protected] directory=ftdata dumpfile= OLAP_FT2015_20150430.dmp remap_schema

quartz-2.3.0的sql錶檔案位置

quartz-2.3.0的sql錶轉儲檔案所在位置: repository\org\quartz-scheduler\quartz\2.3.0 對quartz-2.3.0.jar進行解壓縮 進入解壓縮後的檔案: quartz-2.3.0\org\quartz\impl\jdbcjobsto

利用Windows自帶的功能當程式崩潰時產生崩潰檔案(dmp)

 何志丹 以管理員身份 執行 :OpenDump.bat 其本質是寫登錄檔。 執行後: 任何程式崩潰都會在C:\CrashDump 產生dmp檔案(比較大,約50到200M)。 至少在Win7、Win10的電腦,Win10的平板上執行正確。 OpenDump.bat @e

Cloudera Manager叢集報警,目錄/tmp 或日誌目錄/var/log 可用空間小於 5.0 吉位元組

在Cloudera Manager上收到報警資訊如下:日誌目錄可用空間 抑制...此角色的 日誌目錄 所在的檔案系統的可用空間小於 5.0 吉位元組。 /var/log/hbase(可用:3.4 吉位元

在windows平臺,用jmap命令得到檔案

jmap命令在windows平臺和linux平臺下用法不一樣,本文說的是windows下的操作 先用jps找到目標程序的pid,比如是1345 然後用以下命令: jmap -dump:format=b,

本地使用impdp匯出伺服器檔案,本地使用impdp匯入遠端資料庫使用者

Microsoft Windows [版本 6.1.7600] 版權所有 (c) 2009 Microsoft Corporation。保留所有權利。 C:\windows\system32>sqlplus system/system SQL*Plus: Release 11.1.0.6.0 -

ORA-39143: 檔案可能是原始的匯出檔案

問題 options ORA-39001: 引數值無效 ORA-39000: 轉儲檔案說明錯誤 ORA-39143: 轉儲檔案 “.dmp” 可能是原始的匯出轉儲檔案 原因分析: .dm

impdp匯入dmp檔案ORA-39088: 檔名不能包含路徑說明ORA-39001: 引數值無效ORA-39000: 檔案說明錯誤

C:\Users\zengmiaogen>impdp yinda/[email protected]:1521/XE file=c:\hz_toolbox_20160613.dmp f

獲取JVM檔案的Java工具類

在上期文章如何獲取JVM堆轉儲檔案中,介紹了幾種方法獲取JVM的轉儲檔案,其中程式設計方法是裡面唯一一個從JVM內部獲取的方法。這裡就不演示了其他方法獲取正在執行的應用程式的堆轉儲,重點放在了使用程式設計來獲取轉儲檔案的方法,並演示瞭如何使用jhat工具瀏覽/分析生成的二進位制堆轉儲。 你可能想在各個時間點從

DBA必備技能:資料庫掛起時進行分析診斷案例

在上週末培訓中,有同學問起:如何在資料庫掛起時進行診斷和分析?這裡就是這樣一個案例。分析、深入,解資料庫之疑難。 在 Oracle 資料庫的執行過程中,可能會因為一些異常遇到資料庫掛起失去響應的狀況,在這種狀況下,我們可以通過對系統狀態進行轉儲,獲得跟蹤檔案進行資料庫問題分析;很多時候資料庫也會自動

windows 應用程式崩潰時的記憶體及dump檔案分析

1、在現場設定程式崩潰時的自動記憶體轉儲,得到dump檔案        在windows 登錄檔如下項:      //HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/AeDebug

Linux中利用logrotate來對log檔案進行

使用logrotate對日誌檔案轉儲,按時或者按大小。 logrotate簡介 NAME logrotate - rotates, compresses, and mails system logs SYNOPSIS