天天看點

java學習-【轉】使用Eclipse MAT查找記憶體洩漏工具介紹

程老師原文位址:http://flychao88.iteye.com/blog/2192266 原文如下:

一、MAT是什麼?

      MAT(Memory Analyzer Tool),一個基于Eclipse的記憶體分析工具,是一個快速、功能豐富的JAVA heap分析工具,它可以幫助我們查找記憶體洩漏和減少記憶體消耗。使用記憶體分析工具從衆多的對象中進行分析,快速的計算出在記憶體中對象的占用大小,看看是誰阻止了垃圾收集器的回收工作,并可以通過報表直覺的檢視到可能造成這種結果的對象。

二、如何使用

使用的方法将dump檔案導入然後進行分析。

方法如下:

1、通過JMX的MBean生成目前的Heap資訊,大小為一個3G(整個堆的大小)的hprof檔案,如果沒有啟動JMX可以通過Java的JMAP指令來生成該檔案。

2、 要考慮的是如何打開這個DUMP的堆資訊檔案,顯然一般的Window系統沒有這麼大的記憶體,必須借助高配置的Linux。當然我們可以借助X-Window把Linux上的圖形導入到Window。我們考慮用下面幾種工具打開該檔案:

Visual VM、IBM HeapAnalyzer、JDK 自帶的Hprof工具。

       使用這些工具時為了確定加載速度,建議設定最大記憶體為6G。使用後發現,這些工具都無法直覺地觀察到記憶體洩漏,Visual VM雖能觀察到對象大小,但看不到調用堆棧;HeapAnalyzer雖然能看到調用堆棧,卻無法正确打開一個3G的檔案。可以使用MAT工具直接導入檔案,生成圖表資訊和疑似有問題的JAVA類,如下圖所示:

***************************原文結束,學習筆記開始***************************

之前的關于OOM異常的學習筆記提到過,對于出現記憶體洩露等疑難問題,需要保留日志,mat進行分析。

那就開搞吧,體會下過程。

1安裝mat。

要是MyEclipse,網上有教程怎麼安裝,我本機安裝的事Spring Tool Suite  Version: 3.5.0.RELEASE.

也可以從sts - >help - > Install New Software。

https://www.eclipse.org/mat/downloads.php 

這是下載下傳頁面。裡面有對應的位址。copy出來。

在workwith輸入http://download.eclipse.org/mat/1.5/update-site/。選擇第一個,然後一路安裝見下圖。

java學習-【轉】使用Eclipse MAT查找記憶體洩漏工具介紹

console安裝完提示重新開機. 又發現一個問題。jdk我安裝的事 64位,但是sts是同僚拷的32位的,是以下載下傳的插件也是32位的,沒法運作,悲劇了 沒辦法,直接下載下傳MemoryAnalyzer-1.5.0.20150527-win32.win32.x86_64.zip。解壓縮後直接運作。

 ****************安裝完成,進入分析dump階段****************** 找個以前的dump看看。結果打開就報錯。 ! ENTRY org.eclipse.mat.ui 4 0 2016-03-09 14:41:27.773 !MESSAGE Error opening heap dump '31615.dump'. Check the error log for further details. !STACK 0 org.eclipse.mat.SnapshotException: Error opening heap dump '31615.dump'. Check the error log for further details. at org.eclipse.mat.parser.internal.SnapshotFactoryImpl.parse(SnapshotFactoryImpl.java:268) at org.eclipse.mat.parser.internal.SnapshotFactoryImpl.openSnapshot(SnapshotFactoryImpl.java:126) at org.eclipse.mat.snapshot.SnapshotFactory.openSnapshot(SnapshotFactory.java:145) at org.eclipse.mat.ui.snapshot.ParseHeapDumpJob.run(ParseHeapDumpJob.java:83) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) Caused by: java.io.IOException: Invalid HPROF file header. at org.eclipse.mat.hprof.AbstractParser.readVersion(AbstractParser.java:143) at org.eclipse.mat.hprof.Pass1Parser.read(Pass1Parser.java:84) at org.eclipse.mat.hprof.HprofIndexBuilder.fill(HprofIndexBuilder.java:80) at org.eclipse.mat.parser.internal.SnapshotFactoryImpl.parse(SnapshotFactoryImpl.java:222) ... 4 more

  上網搜了下,Google有類似報錯,我了解mat隻能打開二進制檔案。

還沒測試完呢不能放棄,自己去生成一個吧。jmap ,這次注意了加了format=b

java學習-【轉】使用Eclipse MAT查找記憶體洩漏工具介紹

 果然比較大,900多M。下載下傳到本機。

-rw------- 1 cloud-user cloud-user 907M Mar  9 15:26 8423

打開剛才下載下傳檔案。“File->Open heap dump...”打開指定的dump檔案後,将會生成Overview選項,

,當然對于我的爛電腦來說是個有點漫長的過程,記憶體快滿了,期間很卡。如下圖所示:

java學習-【轉】使用Eclipse MAT查找記憶體洩漏工具介紹

 在Overview選項中,以餅狀圖的形式列舉出了程式記憶體消耗的一些基本資訊,其中每一種不同顔色的餅塊都代表了不同比例的記憶體消耗情況。

     1. Histogram可以列出記憶體中的對象,對象的個數以及大小。

     2. Dominator Tree可以列出那個線程,以及線程下面的那些對象占用的空間。

     3.Top consumers通過圖形列出最大的object。

     4.Leak Suspects通過MA自動分析洩漏的原因。

java學習-【轉】使用Eclipse MAT查找記憶體洩漏工具介紹
java學習-【轉】使用Eclipse MAT查找記憶體洩漏工具介紹
java學習-【轉】使用Eclipse MAT查找記憶體洩漏工具介紹

最後,再來看看 Leak Suspects

System Overview

Leaks

Overview
java學習-【轉】使用Eclipse MAT查找記憶體洩漏工具介紹

Problem Suspect 1

One instance of "java.util.concurrent.ArrayBlockingQueue" loaded by "<system class loader>" occupies 43,215,064 (67.49%) bytes. The instance is referenced by com.hshbic.uplus.collect.Thread.QueueObject @ 0x60c89c0d8 , loaded by "sun.misc.Launcher$AppClassLoader @ 0x60c0fdfe0". The memory is accumulated in one instance of "java.lang.Object[]" loaded by "<system class loader>".

Keywords

java.util.concurrent.ArrayBlockingQueue

java.lang.Object[]

sun.misc.Launcher$AppClassLoader @ 0x60c0fdfe0

Details ?

點選details,可以檢視詳情

java學習-【轉】使用Eclipse MAT查找記憶體洩漏工具介紹

以上隻是熟悉下過程。記錄下使用心得。 我想在實際應用中,也是一問題為導向,如果看到頻繁觸發GC,就是借助工具看看是那些類占用記憶體大小,影響回收。