導航:首頁 > 操作系統 > androidmemoryleak

androidmemoryleak

發布時間:2024-11-08 22:49:04

Ⅰ 如何使用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)新建一個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即可。

閱讀全文

與androidmemoryleak相關的資料

熱點內容
安卓數據線長什麼樣子教學視頻 瀏覽:792
紅米安卓12系統怎麼升級 瀏覽:915
菜鳥裹裹加密包裹啥樣的 瀏覽:372
時差測量與無源定位演算法 瀏覽:946
學習通app如何調二倍速 瀏覽:873
中鐵四院平差軟體加密狗價格 瀏覽:729
maj命令 瀏覽:923
精品php源碼 瀏覽:960
自己編寫雲伺服器搶紅包 瀏覽:203
java解壓縮文件加密 瀏覽:887
dlink列印伺服器默認地址 瀏覽:353
php休眠函數 瀏覽:372
金蝶如何打開伺服器 瀏覽:766
e4a手游輔助源碼 瀏覽:777
什麼app可以實時直播 瀏覽:106
蘋果13的app閃退什麼原因 瀏覽:775
尾盤選股源碼公式 瀏覽:450
php日期運算 瀏覽:931
天龍八部長歌伺服器什麼時候開的 瀏覽:199
鬼泣4模型在那個文件夾 瀏覽:229