1. 程式人生 > >Heap記憶體分析工具和MAT 的使用

Heap記憶體分析工具和MAT 的使用

轉自:http://blog.csdn.net/aaa2832/article/details/19419679/

1 記憶體洩漏的排查方法

Dalvik Debug Monitor Server (DDMS)  ADT外掛的一部分,其中有兩項功能可用於記憶體檢查 :

·    heap 檢視堆的分配情況

·    allocation tracker跟蹤記憶體分配情況

DDMS 這兩項功能有助於找到記憶體洩漏的操作行為。

Eclipse Memory Analysis Tools (MAT) 是一個分析 Java堆資料的專業工具,用它可以定位記憶體洩漏的原因。

1.1 觀察 Heap

·        執行程式,然後進入 DDMS管理介面,如下:

 

PS : 點選工具欄上的 來更新統計資訊

點選右側的Cause GC按鈕或工具欄上的 即可檢視當前的堆情況,如下:


主要關注兩項資料:

o    Heap Size 堆的大小,當資源增加,當前堆的空餘空間不夠時,系統會增加堆的大小,若超過上限 (例如 64M,視平臺和具體機型而定)則會被殺掉

o    Allocated 堆中已分配的大小,這是應用程式實際佔用的記憶體大小,資源回收後,此項資料會變小

·        檢視操作前後的堆資料,看是否有記憶體洩漏對單一操作(比如新增頁,刪除頁)進行反覆操作,如果堆的大小一直增加,則有記憶體洩漏的隱患。

1.2 利用MAT分析記憶體堆

DDMS 可以將當前的記憶體 Dump成一個 hprof格式的檔案,MAT 讀取這個檔案後會給出方便閱讀的資訊,配合它的查詢,對比功能,就可以定位記憶體洩漏的原因。

·        獲取 hprof檔案點選工具欄上的 按鈕,將記憶體資訊儲存成檔案。如果是用 MAT Eclipse 外掛獲取的 Dump檔案,則不需要經過轉換,Adt會自動進行轉換然後開啟。

·        轉換 hprof檔案
DDMS Dump 
出的檔案要經過轉換才能被 MAT識別,提供了這個工具hprof-conv(位於 sdk/tools)

·    ./hprof-conv xxx-a.hprof xxx-b.hprof

·         MAT開啟轉換後的 hprof檔案


1.3  Histogram 查詢

用的最多的功能是Histogram,點選 Actions下的 Histogram項將得到 Histogram結果


它按類名將所有的例項物件列出來,可以點選表頭進行排序,在表的第一行可以輸入正則表示式來匹配結果 :


在某一項上右鍵開啟選單選擇list objects ->with incoming refs將列出該類的例項:


它展示了物件間的引用關係,比如展開後的第一個子項表示這個 HomePage(0x420ca5b0)HomePageContainer(0x420c9e40)中的 mHomePage屬性所引用.

快速找出某個例項沒被釋放的原因,可以右健Path to GC Roots-->exclue all phantom/weak/soft etc. reference:


得到的結果是:


從表中可以看出 PreferenceManager -> … ->HomePage這條線路就引用著這個 HomePage例項。用這個方法可以快速找到某個物件的GC Root,一個存在 GC Root的物件是不會被 GC回收掉的.

1.4  Histogram 對比

為查詢記憶體洩漏,通常需要兩個 Dump結果作對比,開啟 Navigator History面板,將兩個表的 Histogram結果都新增到 Compare Basket中去 :


新增好後,開啟 Compare Basket面板,得到結果:


點選右上角的!按鈕,將得到比對結果:


注意,上面這個對比結果不利於查詢差異,可以調整對比選項


再把對比的結果排序,就可得到直觀的對比結果:


也可以對比兩個物件集合,方法與此類似,都是將兩個 Dump結果中的物件集合新增到Compare Basket中去對比。找出差異後用 Histogram查詢的方法找出 GC Root,定位到具體的某個物件上。

1.5  例子

舉例一個典型的分析記憶體洩漏的過程:

1.  使用 Heap檢視當前堆大小為 23.00M

2.  新增一個頁後堆大小變為 23.40M

3.  將新增的一個頁刪除,堆大小為 23.40M

4.  多次操作,結果仍相似,說明新增/刪除頁存在記憶體洩漏 (也應注意排除其它因素的影響)

5.  Dump 出操作前後的 hprof 檔案 (1.hprof,2.hprof),用 mat開啟,並得到 histgram結果

6.  使用 HomePage欄位過濾 histgram結果,並列出該類的物件例項列表,看到兩個表中的物件集合大小不同,操作後比操作前多出一個 HomePage,說明確實存在洩漏

7.  將兩個列表進行對比,找出多出的一個物件,用查詢 GC Root的方法找出是誰串起了這條引用線路,定位結束

PS :

·        很多時候堆增大是 Bitmap引起的,Bitmap Histogram中的型別是 byte [],對比兩個 Histogram中的 byte[] 物件就可以找出哪些 Bitmap有差異

·        多使用排序功能,對找出差異很有用

2 記憶體洩漏的原因分析

總結出來只有一條:存在無效的引用!良好的模組設計以及合理使用設計模式有助於解決此問題。

3 Tips

·    使用 android:largeHeap="true"標記 (API Level >= 11) AndroidManifest.xml中的 Application節點中宣告即可分配到更大的堆記憶體, android:largeHeap標記在 Android系統應用中也有廣泛的應用 ,比如 Launcher, Browser這些記憶體大戶上均有使用.

4 參考


相關推薦

Heap記憶體分析工具MAT 的使用

轉自:http://blog.csdn.net/aaa2832/article/details/19419679/ 1 記憶體洩漏的排查方法 Dalvik Debug Monitor Server (DDMS) 是 ADT外掛的一部分,其中有兩項功能可用於記

Eclipse MAT記憶體分析工具(Memory Analyzer Tool)

MAT記憶體分析工具 MAT是Memory Analyzer的簡稱,它是一款功能強大的Java堆記憶體分析器。可以用於查詢記憶體洩露以及檢視記憶體消耗情況。MAT是基於Eclipse開發的,是一款免費的效能分析工具。讀者可以在http://www.eclipse.org/mat/下載並使用MAT。 1 初

Mac os 下開啟java記憶體分析工具 mat

下載MAT後, 解壓得到mat.app, 但是直接點選打開出錯, 顯示錯誤資訊在檔案 /Users/along/.eclipse/762171948_macosx_cocoa_x86_64/configuration/1539580415773.log中. 1.

Eclipse MAT 記憶體分析工具

記錄下andorid開發中 Eclipse下MAT(Memory Analysis Tools)工具使用過程 參考:http://www.blogjava.net/rosen/archive/2010/06/13/323522.html http://blog.csdn.n

安卓記憶體分析工具Mat的基本用法

由於android studio自帶的記憶體監控工具不是很強大,在分析記憶體洩漏方面比較麻煩,遠比不上Eclipse自帶的Mat工具,Android Studio沒有自帶這款工具,所以需要自行下載獨立版的Mat,下面先介紹一下它的一些配置及用法: 1,首先開啟我們的Andr

android記憶體分析工具- MAT的初識(1)

目標:該系列文章帶領大家掌握android記憶體溢位的排查,讓記憶體問題不再是android開發者的門檻。 DDMS(Dalvik Debug Monitor Server)和MAT(Memory Analyzer Tool)這兩個工具可以很好地幫助我們分析優

記憶體分析工具MAT(Memory Analyzer Tool)從安裝到使用

一.安裝 首先,你得有一個Eclipse(因為MAT是Eclipse的外掛) 然後,你要在Eclipse上安裝MAT,步驟如下: 1.點選Help,Install New Soft,就出現了以下Install介面:然後我們點選ADD,在彈出的框中填上Mat外掛的地址:htt

記憶體分析工具MAT(Memory Analyzer Tool)從安裝到使用,配合jconsole jvisualvm分析

一.安裝 首先,你得有一個Eclipse(因為MAT是Eclipse的外掛) 然後,你要在Eclipse上安裝MAT,步驟如下: 1.點選Help,Install New Soft,就出現了以下Install介面:然後我們點選ADD,在彈出的框中填上Mat外掛的地址:h

記憶體分析工具 MAT 的使用

1 記憶體洩漏的排查方法 Dalvik Debug Monitor Server (DDMS) 是 ADT外掛的一部分,其中有兩項功能可用於記憶體檢查 : ·    heap 檢視堆的分配情況 ·    allocation tracker跟蹤記憶體分配情況

eclipse記憶體分析工具MAT Memory Analyzer Tool 外掛安裝(圖解)

第一步:下載Eclipse MAT 下載地址:http://www.eclipse.org/mat/downloads.php 第二步:下載之後將壓縮包解壓,放置到Myeclipse 的\MyEclipse 9\dropins目錄下 解壓後會看見這些檔案: 糾正下面一個錯別字不是"寫"是 "下"

Android記憶體優化:詳解記憶體分析工具MAT

前言在這個系列的前四篇文章中,我分別介紹了DVM、ART、記憶體洩漏和記憶體檢測工具的相關知識點,這一篇我們通過一個小例子,來學習如何使用記憶體分析工具MAT。1.概述在進行記憶體分析時,我們可以使用Memory Monitor和Heap Dump來觀察記憶體的使用情況、使用

[Android Memory] 記憶體分析工具 MAT 的使用

Dalvik Debug Monitor Server (DDMS) 是 ADT外掛的一部分,其中有兩項功能可用於記憶體檢查 : ·    heap 檢視堆的分配情況 ·    allocation tracker跟蹤記憶體分配情況 DDMS 這兩項功能有助於找到記憶體洩漏的操作行為。 Eclipse M

記憶體分析工具MAT的使用

MAT簡介 MAT(Memory Analyzer Tool),一個基於Eclipse的記憶體分析工具,是一個快速、功能豐富的JAVA heap分析工具,它可以幫助我們查詢記憶體洩漏和減少記憶體消耗。使用記憶體分析工具從眾多的物件中進行分析,快速的計算

Java程式記憶體分析:使用mat工具分析記憶體佔用

MAT 不是一個萬能工具,它並不能處理所有型別的堆儲存檔案。但是比較主流的廠家和格式,例如 Sun, HP, SAP 所採用

mysql慢查詢分析工具分析方法

mysql 慢查詢 分析工具 1.mysql慢查詢分析工具1.參考文檔:http://www.ttlsa.com/mysql/analyse-slow-query-log-using-anemometer/http://isadba.com/?p=655官方文檔:https://github.co

Java內建常用記憶體分析工具使用教程

jstack 列印記憶體使用情況 jstat -gc 25221 1000 60 取樣 S0C S1C S0U S1U EC EU OC OU MC MU CCSC

一個golang編寫的redis記憶體分析工具rma4go

redis 記憶體分析工具 rma4go 簡介 redis是一個很有名的記憶體型資料庫,這裡不做詳細介紹。而rma4go (redis memory analyzer for golang) 是一個redis的記憶體分析工具,這個工具的主要作用是針對執行時期的redis進行記憶體的分析,統計redis中ke

redis 記憶體分析工具 `rma4go`

redis 記憶體分析工具 rma4go redis是一個很有名的記憶體型資料庫,這裡不做詳細介紹。而rma4go (redis memory analyzer for golang) 是一個redis的記憶體分析工具,這個工具的主要作用是針對執行時期的redis進行記憶體的分析,統計r

安裝Redis記憶體分析工具rdbtools

一、安裝Python2.7 1、wget http://10.12.29.98:8090/tools/Python-2.7.11.tgz 2、ln -s /usr/local/python2.7/bin/python /usr/bin/python2.73、wget https://pypi.pyt

redis audit記憶體分析工具在redis cluster中的應用

內容: redis audit工具是使用ruby語言編寫的指令碼,用來分析redis哪些key佔記憶體比較多,及佔用記憶體較多的key鍵的過期時間。在分析redis記憶體增長時非常有幫助。在分析時,為了防止對生產庫的影響,一般在從庫上執行。但是在使用redis aud