導航:首頁 > 操作系統 > androidmat分析工具

androidmat分析工具

發布時間:2022-12-18 14:03:31

android 分析OOM工具介紹

如圖1所示, 步驟
** 1, 2, 3** 為打開Android Monitor並切換標簽到monitor的過程

4, 5, 6 對應的圖標和文字含義分別是

MAT 工具識別,並解析hprof文件,
有兩種方式可以獲得hprof文件

MAT並不能直接打開這兩個hprof, 必須通過hprof-conv來轉換一次

如圖3所示,選中(過濾出MainActivity), 然後通過Objects可以看出它有8個實例

接著選中 com.example.wowo.MainActivity 然後右鍵選擇
Merge shortest paths to GC Roots -> exclude week references

因為弱引用是會被回收的,所以排除掉更加容易發現OOM.

什麼是OOM out-of-memory?

Android下的APP運行在VM中(Dalvik or ART), 一個APP需要的內存是有限,這個值在不同的平台, 不同的手機上是不同的,當APP需要的內存超過了內存上限,就會引起OOM.

下面給出一個最基本的Android APP顯示HelloWorld的例子.

這時如果不停的旋轉屏幕, 這時通過觀察Android Monitor里的Free和allocated的memory會發現 allocated 的memory會不斷增加,而Free的memory會不斷減小

這時通過圖1中步聚5 mp java heap, 然後filter到MainActivity, 會發現MainActivity有多個實例

接著再通過MAT來分析, 圖4所示

發現有很多FinalizerReference, 應該是與GC有關,由於旋轉屏幕會導致MainActivity銷毀並重新創建實例,而JVM在創建MainActivity實例時還有free的memory, 所以並沒有觸發GC,即原來的MainActivity的實例並沒有被回收,所以多次旋轉後,在free memory還有的情況下就會保存多個MainActivity的實例造成內存泄露的假象。當free memory 不夠時,這時會觸發GC, 會回收之前銷毀的MainActivity的實例。

所以在查看OOM問題時,當allocated內存不斷增大時,應該人為先觸發GC(點擊圖1的4)。
如果allocated的內存沒有下降,說明當前並沒有可回收的實例占據內存了。

而在該例中,如果點擊了initiate GC後,allocated的內存立即減少了。
Android Monitor看到MainActivity也就只有一個實例了。

❷ 如何使用MAT分析Android應用內存泄露

一、新建測試應用
1)新建一個Android 測試應用。
填寫好應用的名稱,以及保存位置後,直接下一步到最後點擊「Finish」。
2)添加一個測試Activity:Activity2。
3)添加測試代碼ActivityHelper:
這里用常用的線程長時間執行,導致外部Activity Destroy時還持有 activity的內容導致內存泄露。
主要代碼如下:
public class ActivityHelper {
private Context mContext;
public ActivityHelper(Context context) {
this.mContext=context;
}
/** * 列印ActivityName */
public void printActivityName() {
for(int i = 0; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while (true)
try {
Thread.sleep(1000*30);
Log.d(ActivityHelper.class.getSimpleName(), ((Activity)mContext).getClass().getSimpleName());
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}}
4)在Activity2中的onCreate方法中調用單例:
new ActivityHelper().printActivityName();
然後再MainActivity中點擊「Setting」菜單欄打開Activity2:
Intent intent=newIntent(MainActivity.this,Activity2.class);startActivity(intent);
最後按返回鍵返回。
按照以上操作,運行程序。
5)多次進入Activity2之後會發現內存一直在增長,並沒有降低。
而且log里會不停的輸出log,列印當前activity的name
END
二、抓取內存信息
1)點擊Android Studio工具欄上得「AndroidDevice Monitor」,打開後如圖:
2)先在android設備上打開我們的應用
然後在devices里選中我們測試的應用,點擊「update heap」
3)來回點擊「settings」進入Activity2數次後,點擊「DUMP HPROF file」保存文件。
4)轉換HPROF文件。
利用android sdk 的工具進行轉換:
到sdk/platform-tools/目錄下,打開終端輸入:
./hprof-conv/Users/xxx/Desktop/gc/com.lulee007.androidmemoryleakdemo.hprof/Users/xxx/Desktop/gc/com.lulee007.androidmemoryleakdemo.out.hprof
進行轉換.
最終得到這個文件:com.lulee007.androidmemoryleakdemo.out.hprof
三、使用Memory Analyzer 分析
1)下載Memory Analyzer 工具:到官網下載合適的版本。
2)打開軟體:從工具欄打開phrof文件選擇「File」>>"openheap mp"
3)點擊下面的「Action」里的「Histogram」,然後搜索ActivityHelper,得到如下結果
右擊其中的一個,選擇「Merge Shortest Paths to GC Roots 」>>"excludeall phantom/weak/soft etc references.."
4)可以看到,ActivityHelper本應該被釋放,但是因為thead持有其中的mContext,而context是activity2里的,所有造成了內存泄露。
解決方法:
1)合理用thread,當activity2,destroy時,需要及時的停止掉thread。
2)可以設置activityhelper的while(true)改為設置變數,如while(notshutdown),
3)然後再destory里調用activityhelper,設置其notshutdown為false即可。

❸ 如何用MAT分析Android應用內存泄露

Android應用開發過程中,稍一不小心經常會出現內存泄露,如何用工具來檢測下我們的應用是否存在內存泄露呢?MAT就是一款非常好用的分析應用內存使用情況的工具,使用起來也非常簡單,下面小編就來和大家分享下具體的操作步驟。
工具/原料
Eclispe
MAT
方法/步驟
在Eclipse中新建一個Android工程,名字叫做:memoryleak。功能很簡單,只有一個MainActivity和一個ImageUtil。我們在MainActivity中使用ImageUtil來載入圖片。注意我們的ImageUtil是單例類。在創建的時候需要傳入context。
應用起來以後,轉屏。轉屏以後,MainActivity會重建,導致ImageUtil重新載入圖片。很不幸的是,因為ImageUtil並沒有重建,還持有之前的Context,也就是之前的那個MainActivity實例。多次轉屏以後,我們在Eclipse的DDMS裡面,導出內存映像文件。導出的文件叫做:com.example.memoryleak.hprof。
DDMS導出的內存映像文件並不能被MAT直接使用。需要轉換一下。在命令行輸入:hprof-conv
com.example.memoryleak.hprof
memoryleak.hprof。
用MAT打開memoryleak.hprof。
點擊「Histogram」
在Class
Name後面的輸入框輸入應用的名字:com.example.memoryleak。
可以看到有4個MainActivity實例,如果沒有泄露的情況下只應該有一個實例,說明存在內存泄露。在MainActivity上點擊右鍵->"Merge
Shortest
Paths
To
GC
Roots"->"exclude
all
phantom/weak/soft
etc.refrences"。
在打開的頁面中,點擊可以看到詳細的引用信息。

❹ 如何使用MAT分析Android應用內存泄露

使用Android Studio,Android Device Monitor 配合Eclipse的MAT(
Memory Analyzer)工具來分析android內存泄露。
新建一個Android 測試應用。填寫好應用的名稱,以及保存位置後,直接下一步到最後點擊「Finish」。

2、添加一個測試Activity:Activity2。

3、
添加測試代碼ActivityHelper:
這里用常用的線程長時間執行,導致外部Activity Destroy時還持有 activity的內容導致內存泄露。
主要代碼如下:
public class ActivityHelper {
private Context mContext;
public ActivityHelper(Context context) {
this.mContext=context;
}
/** * 列印ActivityName */
public void printActivityName() {
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while (true)

4、在Activity2中的onCreate方法中調用單例:
new ActivityHelper().printActivityName();
然後再MainActivity中點擊「Setting」菜單欄打開Activity2:
Intent intent=new Intent(MainActivity.this,Activity2.class);startActivity(intent);
最後按返回鍵返回。
按照以上操作,運行程序。

5、
多次進入Activity2之後會發現內存一直在增長,並沒有降低。
而且log里會不停的輸出log,列印當前activity的name

抓取內存信息
1、點擊Android Studio工具欄上得「Android Device Monitor」,打開後如圖:

2、
先在android設備上打開我們的應用
然後在devices里選中我們測試的應用,點擊「update heap」

3、
來回點擊「settings」進入Activity2數次後,點擊
「DUMP HPROF file」保存文件。

4、轉換HPROF文件。
利用android sdk 的工具進行轉換:
到sdk/platform-tools/目錄下,打開終端輸入:
./hprof-conv /Users/xxx/Desktop/gc/com.lulee007.androidmemoryleakdemo.hprof /Users/xxx/Desktop/gc/com.lulee007.androidmemoryleakdemo.out.hprof
進行轉換.
最終得到這個文件:com.lulee007.androidmemoryleakdemo.out.hprof

❺ 如何使用MAT分析Android應用內存泄露

工具:MAT,Eclispe。
在Eclipse中新建一個Android工程,名字叫做:memoryleak。功能很簡單,只有一個MainActivity和一個ImageUtil。我們在MainActivity中使用ImageUtil來載入圖片。注意我們的ImageUtil是單例類。在創建的時候需要傳入context。
2.應用起來以後,轉屏。轉屏以後,MainActivity會重建,導致ImageUtil重新載入圖片。很不幸的是,因為ImageUtil並沒有重建,還持有之前的Context,也就是之前的那個MainActivity實例。多次轉屏以後,我們在Eclipse的DDMS裡面,導出內存映像文件。導出的文件叫做:com.example.memoryleak.hprof。
3.DDMS導出的內存映像文件並不能被MAT直接使用。需要轉換一下。在命令行輸入:hprof-conv com.example.memoryleak.hprof memoryleak.hprof。
4.用MAT打開memoryleak.hprof。再點擊「Histogram」,
5.在打開的頁面中,點擊可以看到詳細的引用信息,就可以看沒有出錯了。

❻ android mat 什麼意思

簡單的說就是android的一個內存分析工具。幫助優化你的app。

MAT(Memory Analyzer Tool),一個內存分析工具,是一個快速、功能豐富的JAVA heap分析工具,它可以幫助我們查找內存泄漏和減少內存消耗。使用內存分析工具從眾多的對象中進行分析,快速的計算出在內存中對象的佔用大小,看看是誰阻止了垃圾收集器的回收工作,並可以通過報表直觀的查看到可能造成這種結果的對象。

你可以把它集成到android studio或者Eclipse裡面。然後使用它分析你的app。具體的使用方法你可以網上搜索。

❼ 如何使用MAT分析Android應用內存泄露

舉個例子,方法步驟見下:
1在Eclipse中新建一個Android工程,名字叫做:memoryleak。功能很簡單,只有一個MainActivity和一個ImageUtil。在MainActivity中使用ImageUtil來載入圖片。注意ImageUtil是單例類。在創建的時候需要傳入context。

2應用起來以後,轉屏。轉屏以後,MainActivity會重建,導致ImageUtil重新載入圖片。很不幸的是,因為ImageUtil並沒有重建,還持有之前的Context,也就是之前的那個MainActivity實例。多次轉屏以後,在Eclipse的DDMS裡面,導出內存映像文件。導出的文件叫做:com.example.memoryleak.hprof。

3DDMS導出的內存映像文件並不能被MAT直接使用。需要轉換一下。在命令行輸入:hprof-conv com.example.memoryleak.hprof memoryleak.hprof。

4用MAT打開memoryleak.hprof。

5點擊「Histogram」

6在Class Name後面的輸入框輸入應用的名字:com.example.memoryleak。

7可以看到有4個MainActivity實例,如果沒有泄露的情況下只應該有一個實例,說明存在內存泄露。在MainActivity上點擊右鍵->"Merge Shortest Paths To GC Roots"->"exclude all phantom/weak/soft etc.refrences"。

8在打開的頁面中,點擊可以看到詳細的引用信息。

9上圖中可以看出來是ImageUtil引用了一個MainActivity的實例。這樣就找到了泄露的根源,就可以進行處理了。

❽ 如何使用MAT分析Android應用內存泄露

1、新建測試應用
1
新建一個Android 測試應用。
填寫好應用的名稱,以及保存位置後,直接下一步到最後點擊「Finish」。

2
添加一個測試Activity:Activity2。

3
添加測試代碼ActivityHelper:
這里用常用的線程長時間執行,導致外部Activity Destroy時還持有 activity的內容導致內存泄露。
主要代碼如下:
public class ActivityHelper {
private Context mContext;
public ActivityHelper(Context context) {
this.mContext=context;
}
/** * 列印ActivityName */
public void printActivityName() {
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
while (true)
try {
Thread.sleep(1000*30);
Log.d(ActivityHelper.class.getSimpleName(), ((Activity) mContext).getClass().getSimpleName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}}

4
在Activity2中的onCreate方法中調用單例:
new ActivityHelper().printActivityName();
然後再MainActivity中點擊「Setting」菜單欄打開Activity2:
Intent intent=new Intent(MainActivity.this,Activity2.class);startActivity(intent);
最後按返回鍵返回。
按照以上操作,運行程序。

5
多次進入Activity2之後會發現內存一直在增長,並沒有降低。
而且log里會不停的輸出log,列印當前activity的name

2、抓取內存信息
1
點擊Android Studio工具欄上得「Android Device Monitor」,打開後如圖:

2
先在android設備上打開我們的應用
然後在devices里選中我們測試的應用,點擊「update heap」

3
來回點擊「settings」進入Activity2數次後,點擊
「DUMP HPROF file」保存文件。

4
轉換HPROF文件。
利用android sdk 的工具進行轉換:
到sdk/platform-tools/目錄下,打開終端輸入:
./hprof-conv /Users/xxx/Desktop/gc/com.lulee007.androidmemoryleakdemo.hprof /Users/xxx/Desktop/gc/com.lulee007.androidmemoryleakdemo.out.hprof
進行轉換.
最終得到這個文件:com.lulee007.androidmemoryleakdemo.out.hprof

3、使用Memory Analyzer 分析
下載Memory Analyzer 工具:
到官網下載:
http://www.eclipse.org/mat/downloads.php
選擇合適的版本。

打開軟體:
從工具欄打開phrof文件選擇「File」>>"open heap mp"

點擊下面的「Action」里的「Histogram」,然後搜索ActivityHelper
得到如下結果

右擊其中的一個,選擇「Merge Shortest Paths to GC Roots 」>>"exclude all phantom/weak/soft etc references.."

可以看到,ActivityHelper本應該被釋放,但是因為thead持有其中的mContext,而context是activity2里的,所有造成了內存泄露。

解決方法:
合理用thread,當activity2,destroy時,需要及時的停止掉thread。
可以設置activityhelper的while(true)改為設置變數,如while(notshutdown),
然後再destory里調用activityhelper,設置其notshutdown為false即可。

閱讀全文

與androidmat分析工具相關的資料

熱點內容
扣扣加密技巧 瀏覽:720
蘋果如何創建伺服器錯誤 瀏覽:495
軟考初級程序員大題分值 瀏覽:473
js壓縮視頻文件 瀏覽:578
linux如何通過命令創建文件 瀏覽:989
應用加密app還能訪問應用嘛 瀏覽:433
安卓怎麼用支付寶交違章罰款 瀏覽:665
php面向對象的程序設計 瀏覽:504
數據挖掘演算法書籍推薦 瀏覽:894
投訴聯通用什麼app 瀏覽:150
web伺服器變更ip地址 瀏覽:954
java正則表達式驗證郵箱 瀏覽:360
成熟商務男裝下載什麼軟體app 瀏覽:609
加密2h代表長度是多少厘米 瀏覽:23
拍賣程序員 瀏覽:102
電腦的圖片放在哪個文件夾 瀏覽:276
unsignedintjava 瀏覽:217
編譯器下載地址 瀏覽:43
什麼是面對對象編程 瀏覽:709
b站伺服器什麼時候恢復 瀏覽:722