1. 程式人生 > >記憶體洩漏 之 MAT工具的使用

記憶體洩漏 之 MAT工具的使用

1 記憶體洩漏的排查方法

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

·    heap 檢視堆的分配情況

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

·    eclipse外掛:http://download.eclipse.org/mat/1.5/update-site/

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識別,Android SDK提供了這個工具 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 參考

相關推薦

記憶體洩漏 MAT工具的使用

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

記憶體洩漏排查 MAT工具使用

説在前面:儘管Java虛擬機器可以幫我們對記憶體進行回收,但是其回收的是Java虛擬機器不再引用的物件。很多時候我們使用系統的IO流,Cursor,Receiver如果不及時釋放,就會導致記憶體洩漏,這些場景是常見的,一般開發人員也都能夠避免。但是,很多時候記憶體洩漏的現象不

記憶體洩漏檢測分析工具mat(memory analyzer tool) 的使用

.下載、安裝 地址:http://www.eclipse.org/mat/downloads.php  直接解壓即可 初始介面 .獲取對應程序的heapdump,使用jmap命令         jmap -dump:

記憶體洩漏檢測分析工具MAT(Memory Analyzer Tool)的使用

工具下載地址:https://www.eclipse.org/mat/   首先準備一個案例demo。上次講了經典Handler導致的記憶體洩漏,今天也講個經典例子。單例造成的記憶體洩漏。 public class MySingleton { priva

記憶體洩漏檢測分析工具

monkey 工具測試應用 可以使用monkey自動化測試工具快速不斷的操作應用。終端指令: // 300 毫秒一個事件,2000個事件,跑10分鐘 adb shell monkey -p com.android.deskclock -v --throttle 300 --ign

匯出記憶體映象檔案與記憶體異常分析(MAT工具)

記憶體溢位自動匯出引數: //發生溢位時dump出來 -XX:+HeapDumpOnOutOfMemoryError //dump的路徑 ./為專案啟動根路徑 -XX:HeapDumpPath=./ 記憶體溢位手動匯出引數:jmap命令使用 jdk安裝後會自帶一些小工具,jmap

Android 記憶體洩漏LeakCanary

導言: 記憶體管理是android開發效能中重要的一環,而leakCanary是Square開源框架,是一個Android記憶體洩露檢測庫,是個優秀的 記憶體洩露檢測工具,通過它大大降低oom的出現,提高app的質量 釋義: 記憶體洩漏:物件在有限生命週期內還持有引用,沒有被回

Android記憶體洩漏的檢測工具——LeakCanary

    首先了解什麼是記憶體洩露 http://liuwangshu.cn/application/performance/ram-3-memory-leak.html   1Leakcancary的優勢 LeakCanary是一個視覺化的記憶體

Android 記憶體剖析 MAT講解

簡介 移動平臺上的開發和記憶體管理緊密相關。儘管隨著科技的進步,現今移動裝置上的記憶體大小已經達到了低端桌面裝置的水平,但是現今開發的應用程式對記憶體的需求也在同步增長。主要問題出在裝置的螢幕尺寸上-解析度越高需要的記憶體越多。熟悉Android平臺的開發人員一般都知道垃圾回收器並不能徹底杜絕記憶體洩

Android Handler 避免記憶體洩漏清空佇列

Android開發經常會用到handler,但是我們發現每次使用Handler都會出現:This Handler class should be static or leaks might occur(null)這樣的提示。Android lint就是為了提示我們,這樣使

檢測記憶體洩漏的常見工具-LeakCanary

見到這個標題有經驗的開發者可能要吐槽我是標題黨了,特別是從Eclipse時代走過來的開發者,以為我一要開始貼那張像**一樣的MAT記憶體模型圖或者AndroidStudio中Monitors下的實時記憶體佔用圖,又要開始分析那一條條剪不斷理還亂的記憶體引用鏈,然後費盡九牛

關於Android中的記憶體洩漏非同步操作

Android中記憶體洩漏是比較讓人頭痛的一塊問題,這兩天研究了下,放點乾貨吧,有時間再好好解析。 首先是如何檢查記憶體洩漏,這裡推薦使用square的leakCanary,絕對的神器。Github地址: 然後是一個自己寫的Demo,裡面有用到leakCanary進行記憶

一個簡單的記憶體洩漏檢測C工具

  這個記憶體洩漏檢測工具很簡單,只能檢測同一個模組,同一個執行緒中傳送的記憶體洩漏,對於在編寫程式碼過程中的程式碼除錯有一定的幫助。如果要在整合測試或功能測試中檢測記憶體洩漏,還需藉助專門的工具。 1. 先取向malloc,free和calloc這幾個識別符號的定義:注意

vc6.0記憶體洩露檢測工具Visual Leak Detector

如果僅僅是使用的話,無需看下面文章,只需做以下三步,當然先下載visual leak detector包,解壓後: (1)把vld.h vldapi.h拷貝到vc安裝目錄下的include資料夾下 (2)把lib檔案拷貝到vc安裝目錄下的lib資料夾下 (3)需要測試的

Android 常見記憶體洩漏四大元凶

對於記憶體洩漏,我想大家應該都有碰到過,常見的表現就是異常程式退出。 到了程式強制關閉的時候,那已經到了一定的程度了。一般時候記憶體洩漏了我們是看不見的。因為它在堆中活動。 所以常常我們會通過一些工具來檢測。例如:LeakCanary、MAT等工具。 MAT是一款強大的記

Linux下記憶體洩漏定位常用工具介紹

寫在前面:本人只是一個linux開發新手,對linux下開發充滿熱情,前段時間接手一個linux下程式效能優化的工作,自己在整個過程中零零散散的總結了一些經驗,特別把查詢和定位記憶體洩漏方面的經驗寫下來,尤其是使用的幾個開源工具,希望對別人有用,也等於自己做做筆記,便於以後再次使用或學習。整個過程主要有以下幾

JVM:使用 MAT 工具結合jmap命令分析記憶體洩漏

1、下載MAT工具 2、演示記憶體溢位 新建一個springboot專案,新建一個controller @RestController public class HeapControler { private ArrayList<User> a

android MAT、DDMS 等記憶體檢視工具

三、記憶體監測工具 DDMS --> Heap     無論怎麼小心,想完全避免bad code是不可能的,此時就需要一些工具來幫助我們檢查程式碼中是否存在會造成記憶體洩漏的地方。Android tools中的DDMS就帶有一個很不錯的記憶體監測工具Heap(這裡我使用eclipse的ADT外掛,

linux工具檢測記憶體洩漏-valgrind

0.前言 記憶體洩漏是c++程式常見的問題了,特別是服務類程式,當系統模組過多或者邏輯複雜後,很難通過程式碼看出記憶體洩漏; valgrind是一個開源的,檢測c++程式記憶體洩漏有效工具,編譯時加上-g選項可以定位到程式碼行,同時還檢查‘野指標’,檢查malloc與fre

AndroidMat分析記憶體洩漏

安裝完成後提示重啟Eclipse,重啟後開啟window - > open perspective,看到Memory Analysis證明安裝成功。 mat的使用 1.生成hprof檔案 1)進入DDMS 2)在Devices中選擇需要監聽的