android 安装mat插件,Android內存優化神器——MAT使用進階

第一篇文章《Android內存優化之一:MAT使用入門》介紹了MAT的基本使用方法,包括下載、安裝、打開HPROF文件,和一些基本的視圖。這篇文章介紹一下一些最新的工具使用方法,和第一篇中沒有提到的一些其他的用法。

Java的內存泄露的特點

+

Java中的內存泄露主要特征:可達,無用無用指的是創建了但是不再使用之后沒有釋放能重用但是卻創建了新的對象進行處理

MAT使用技巧進階

使用Android Studio Dump內存文件

+

Android Studio的最新版本可以直接獲取hprof文件:

+

2a6b049c1cbad49368b24f562927a2ad.png

+

然后選擇文件,點擊右鍵轉換成標准的hprof文件,就可以在MAT中打開了。

+

+

在使用使用Eclipse或者AndroidStudio抓內存之前,一定要手動點擊 Initiate GC按鈕手動觸發GC,這樣抓到的內存使用情況就是不包括Unreachable對象的。

+

7ad6f21a7d70a1df78f578349c68918c.png

Unreachable對象

+

Unreachable指的是可以被垃圾回收器回收的對象,但是由於沒有GC發生,所以沒有釋放,這時抓的內存使用中的Unreachable就是這些對象。

+

fd2344eba5ed2884a799ef8a580f016d.png

+

a6cfecbdb22318b647432265be63d3a5.png

+

點擊Calculate Retained Size之后,會出現Retained Size這一列

+

58f82d08419e69445e896133b48fbe8b.png

+

a8f644794a9f377dedd523c173e37a9d.png

+

可以看到Unreachable Object的對象其Retained Heap值都為0.這也是正常的。

Histogram

+

MAT中Histogram的主要作用是查看一個instance的數量,一般用來查看自己創建的類的實例的個數。

+

可以很容易的找出占用內存最多的幾個對象,根據Percentage(百分比)來排序。可以分不同維度來查看對象的Dominator Tree視圖,Group by class、Group by class loader、Group by package

和Histogram類似,時間久了,通過多次對比也可以把溢出對象找出來。Dominator Tree和Histogram的區別是站的角度不一樣,Histogram是站在類的角度上去看,Dominator Tree是站的對象實例的角度上看,Dominator Tree可以更方便的看出其引用關系。

+

044501ce8657f1626b7391f6605e3aba.png

+

通過查看Object的個數,結合代碼就可以找出存在內存泄露的類(

即可達但是無用的對象,或者是可以重用但是重新創建的對象)

+

Histogram中還可以對對象進行Group,更方便查看自己Package中的對象信息。

+

a541fcedd72c670fa1a3d230db7c8ab1.png

Thread信息

+

MAT中可以查看當前的Thread信息:

+

2afc08e426cc99c97a90e34b31a4ab7b.png

+

從圖中可以得到的信息:

+

+

可以看到可能有內存問題的Thread:

+

b4d4709cf3f95e5e3678b6e705e180e7.png

+

可以看到數量可能有問題的Thread

+

c99c736e9dd9426c782b5dc195053d17.png

幫助信息

+

MAT中的各個視圖中,在每一個Item中點擊右鍵會出現很多選項,很多時候我們需要依賴這些選項來進行分析:

+

0eb2e8db4814102b6e1aea4559b6ace4.png

+

這些選項的具體含義則可以通過右鍵中的Search Queries這個選項(上圖中的倒數第四個選項)進行搜索和查看,非常的有用。

+

2cb28a97ba47768202ecea08e5b9db65.png

+

可以看到,所有的命令其實就是配置不同的SQL查詢語句。

+

比如我們最常用的:

+

List objects -> with incoming references:查看這個對象持有的外部對象引用

List objects -> with outcoming references:查看這個對象被哪些外部對象引用

Path To GC Roots -> exclude all phantim/weak/soft etc. references:查看這個對象的GC Root,不包含虛、弱引用、軟引用,剩下的就是強引用。從GC上說,除了強引用外,其他的引用在JVM需要的情況下是都可以 被GC掉的,如果一個對象始終無法被GC,就是因為強引用的存在,從而導致在GC的過程中一直得不到回收,因此就內存溢出了。

Path To GC Roots -> exclude weak/soft references:查看這個對象的GC Root,不含弱引用和軟引用所有的引用.

Merge Shortest path to GC root:找到從GC根節點到一個對象或一組對象的共同路徑

Debug Bitmap

+

如果經常使用MAT分析內存,就會發現Bitmap所占用的內存是非常大的,這個和其實際顯示面積是有關系的。在2K屏幕上,一張Bitmap能達到20MB的大小。

+

所以要是MAT提供了一種方法,可以將存儲Bitmap的byte數組導出來,使用第三方工具打開。這個大大提高了我們分析內存泄露的效率。

+

關於這個方法的操作流程,可以參考這篇文章

還原MAT中的Bitmap圖像.

Debug ArrayList

+

ArrayList是使用非常常用的一個數據結構,在MAT中,如果想知道ArrayList中有哪些數據,需要右鍵-> List Objects -> With outgoing references,然后可以看到下面的圖:

+

ecd064d94f8c9f777a243c3041ee4192.png

+

從上圖可以看到,這個ArrayList的內容在一個array數組中,即暴漏了ArrayList的內部結構,查看的時候有點不方便,所以MAT提供了另外一種查看ArrayList內數據的方式:

+

138521dca6e140868f0e5d3720705822.png

+

其結果非常直觀:

+

58d1ac584d8feae72db24f2dbcc5d99b.png

Big Drops In Dominator Tree

+

Big Drops In Dominator Tree選項在右鍵->

+

+

Displays memory accumulation points in the dominator tree. Displayed are objects with a big difference between the retained size of the parent and the children and the first “interesting” dominator of the accumulation point. These are places where the memory of many small objects is accumulated under one object.

+

ebd7a394c6dbbec67f3cd09e2b80b0db.png

文章轉自:http://androidperformance.com/2015/04/11/AndroidMemory-Usage-Of-MAT-Pro/

感謝博主的無私分享!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值