Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> android內存洩露分析工具MAT詳解

android內存洩露分析工具MAT詳解

編輯:Android開發教程

一.准備

1.什麼是MAT

Eclipse提供的一個內存分析工具。它是一個功能豐富的 JAVA 堆轉儲文件分析工具,可以幫助你發現內存漏洞和減少內存消耗。

android studio未集成該插件

需要你下載獨立版

android studio的DDMS可以生成hprof是什麼文件,不過需要進行一下格式轉化(.hprof文件從Dalvik格式轉換成J2SE HPROF格式),才可以導入MAT獨立版軟件。

2.hprof是什麼文件

heap dumps,中文翻譯,堆轉儲,快照。即堆內存某個時刻的情況。

heap dumps,它是更強大的內存分析工具,一個heap dump就是一個程序heap的快照,它保存為一種叫做HPROF的二進制格式。Dalvik用的也是類似的格式,但是不完全一樣,這裡是Java 的HPROF工具 。

3.整個流程

程序運行內存對情況——程序運行堆內存分配情況快照(ddms可以得到,文件格式為hprof)——使用MAT分析該文件——判斷是否出現內存洩露——修改程序

二.MAT分析

1.界面

2.常用術語

Shallow heap

Shallow size就是對象本身占用內存的大小,不包含其引用的對象。

常規對象(非數組)的Shallow size有其成員變量的數量和類型決定。

數組的shallow size有數組元素的類型(對象類型、基本類型)和數組長度決定

因為不像c++的對象本身可以存放大量內存,java的對象成員都是些引用。真正的內存都在堆上,看起來是一堆原生的byte[], char[], int[],所以我們如果只看對象本身的內存,那麼數量都很小。所以我們看到Histogram圖是以Shallow size進行排序的,排在第一位第二位的是byte,char 。

Retained Heap

Retained Heap的概念,它表示如果一個對象被釋放掉,那會因為該對象的釋放而減少引用進而被釋放的所有的對象(包括被遞歸釋放的)所占用的heap大小。於是,如果一個對象的某個成員new了一大塊int數組,那這個int數組也可以計算到這個對象中。相對於shallow heap,Retained heap可以更精確的反映一個對象實際占用的大小(因為如果該對象釋放,retained heap都可以被釋放)。

計算較為復雜,涉及jvm垃圾回收機制:引用鏈。

GC Root

GC發現通過任何reference chain(引用鏈)無法訪問某個對象的時候,該對象即被回收。名詞GC Roots正是分析這一過程的起點,例如JVM自己確保了對象的可到達性(那麼JVM就是GC Roots),所以GC Roots就是這樣在內存中保持對象可到達性的,一旦不可到達,即被回收。通常GC Roots是一個在current thread(當前線程)的call stack(調用棧)上的對象(例如方法參數和局部變量),或者是線程自身或者是system class loader(系統類加載器)加載的類以及native code(本地代碼)保留的活動對象。所以GC Roots是分析對象為何還存活於內存中的利器。

Group

在Histogram和Domiantor Tree界面,可以選擇將結果用另一種Group的方式顯示(默認是Group by Object),切換到Group by package,可以更好地查看具體是哪個包裡的類占用內存大,也很容易定位到自己的應用程序。

Path to GC Root

在Histogram或者Domiantor Tree的某一個條目上,右鍵可以查看其GC Root Path:

URL:http://www.bianceng.cn/OS/extra/201608/50372.htm

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved