記憶體分析工具 MAT 的使用,記憶體分析工具mat

來源:互聯網
上載者:User

記憶體分析工具 MAT 的使用,記憶體分析工具mat

1 記憶體流失的排查方法

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

·    heap 查看堆的分配情況

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

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

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

工具地址 : https://www.eclipse.org/mat/

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識別,Android SDK提供了這個工具 hprof-conv (位於 sdk/tools下)

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

·        用 MAT開啟轉換後的 hprof檔案 


1.3  Histogram 查詢

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


它按類名將所有的執行個體對象列出來,可以點擊表頭進行排序,在表的第一行可以輸入Regex來匹配結果 :


在某一項上右鍵開啟菜單選擇 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 參考

·    DDMS 官方教程 http://developer.android.com/tools/debugging/ddms.html

·    MAT 下載 http://www.eclipse.org/mat/downloads.php

·    MAT 使用 http://android-developers.blogspot.tw/2011/03/memory-analysis-for-android.html


使用android MAT查看記憶體泄露問題,我查看了很多資料,為何在DDMS中沒有hprof檔案?

如何用MAT來分析,前提是Android開發與測試的工具安裝完整,SDK,Eclipse:
1.開啟Eclipse
2.選擇 Help->Install New Software;
3.在Work with中添加網站:download.eclipse.org/mat/1.0/update-site/(這個地址可能會變化,但是新的地址可以在官方網站上找到:www.eclipse.org/mat/downloads.php )
4.產生.hprof檔案:插入SD卡(Android機器很多程式都需要插入SD卡),並將裝置串連到PC,在Eclipse中的DDMS中選擇要測試的進程,然後點擊Update Heap 和Dump HPROF file兩個Button。
.hprof 檔案會自動儲存在SD卡上,把 .hprof 檔案拷貝到PC上的\ android-sdk-windows\tools目錄下。這個由DDMS產生的檔案不能直接在MAT開啟,需要轉換。
運行cmd開啟命令列,cd到\ android-sdk-windows\tools所在目錄,並輸入命令hprof-conv xxxxx.hprof yyyyy.hprof,其中xxxxx.hprof為原始檔案,yyyyy.hprof為轉換過後的檔案。轉換過後的檔案自動放在android-sdk-windows\tools 目錄下。
OK,到此為止,.hprof檔案處理完畢,可以用來分析記憶體泄露情況了。
5.開啟MAT:
在Eclipse中點擊Windows->Open Perspective->Other->Memory Analysis
6.匯入.hprof檔案
在MAT中點擊 File->Open File,瀏覽到剛剛轉換而得到的.hprof檔案,並Cancel掉自動產生報告,點擊Dominator Tree,並按Package分組,選擇自己所定義的Package 類點右鍵,在快顯功能表中選擇List objects->With incoming references。

這時會列出所有可疑類,右鍵點擊某一項,並選擇Path to GC Roots->exclude weak/soft references,會進一步篩選出跟程式相關的所有有記憶體泄露的類。據此,可以追蹤到代碼中的某一個產生泄露的類。
 
有什方便的java記憶體使用量分析工具?

使用Windows作業系統的人有時會遇到這樣的錯誤資訊:“0X?指令引用的0x本文就來簡單分析這種錯誤的常見原因。 一、應用程式沒有檢查記憶體配置失敗
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.