記憶體洩漏--抓取.hprof檔案的方法總結
1、AS抓取檔案
(1)遇到的問題及解決:
(1-1)android studio no debuggable processes
(1-2)解決辦法
(a)Tools->Android->勾選上Enable ADB Integration
(b)重新佈置app
(2)下圖為用as抓取hprof檔案中Monitors-----》Memory中的按鈕含義
點選可以開始或者暫停記憶體檢測的按鈕。
點選相當於GC操作的按鈕,會回收能夠回收掉的記憶體釋放空間。
點選可以直接收集當前檢測中hprof檔案,生成.hprof結尾檔案(點選這個按鈕收集之前要先點選GC按鈕回收能回收的)。
點選開始標記某一時間點然後根據自己需求在某一時間點再次點選可以收集到對應檢測的時間段內執行緒中的記憶體情況,生成
(3)點選下圖圖示生成hprof檔案
(4)檢視生成hprof檔案目錄
點選Studio的最左側-----Captures
雙擊該檔案,在as中顯示如圖
(5)將生成的hprof檔案匯出
該檔案,右鍵選擇 Export standard .hprof,選擇存放目錄即可
Ps:
as生成的檔案直接可以用MAT開啟
2、DDMS抓取檔案
(1)開啟DDMS
通過Android Studio 開啟DDMS的步驟如下
(2)選中需要檢視的程式,並且點選Update Heap圖示
(3)檢視Heap情況
但是這僅僅是檢視一下Heap的使用情況,那如果發現記憶體佔用或者溢位很嚴重,動不動就OOM了。通過這個是看不出什麼東西的,這個時候就需要把Heap抓出來分析,在UpdateHeap邊上還有一個按鈕。
(4)生成.hprof檔案
點一下,會生成一個檔案
(剛生成的.hprof檔案---以程序名為檔名)
Ps:
DDMS生成的檔案需要轉化,才可以用MAT開啟
3、adb命令抓取檔案
(1)命令列提取hprof檔案
(1-1)2種方式
(a)通過程序名
#adb shell am dumpheap <processname> <FileName><hprof檔案的名>
在當前使用者下執行命令
(b)通過PID
#adb shell am dumpheap <PIDxxx> <FileName><hprof檔案的名>
(1-2)#adb pull <FileName> <Dir>
Ps:
DDMS生成的檔案需要轉化,才可以用MAT開啟
4、用MAT工具抓取檔案
(1)開啟工具MAT;
(2)選擇File------》Acquire Heap Dump 如下圖
(3)在圖中看到根據正在執行的程序PID,匯出相應的檔案
檔案存放到所選目錄,同時MAT可以開啟分析
Ps:
MAT抓取的檔案直接可以用MAT開啟
存在的問題:
(1)根據顯示的程序PID,通過cmd,執行adb shell ps 檢視程序PID沒有與之匹配的,就不知道抓取的是哪個應用的洩漏檔案;
(2)相同的PID記憶體洩漏檔案,使用MAT分析的時候餅狀圖不一樣;
註解:
格式轉化(可以用MAT開啟的)
(1)用DDMS生成的.hprof檔案需要轉換後才可以用MAT開啟,轉換步驟如下。
1)、把生成的.hprof檔案複製到hprof-conv所在目錄(在SDK安裝目錄下的platform-tools資料夾下)。
2)、開啟CMD命令列,輸入hprof-conv xxxxx.hprof yyyyy.hprof(其中xxxxx.hprof為原先生成的hprof檔案,yyyyy.hprof為轉換之後hprof)。
(2)具體例子:
#/android-sdk/platform-tools/hprof-conv <FileName> <newFileName>.hprof
用adb命令未實現的:
(1) 命令列方式抓取,方法如下:
a) 通過輸入adb命令的方式抓取,PIDXXX為對應程序的PID:
adb remount
adb shell chmod 0777 /data/misc
adb shell kill -10 PIDXXX
b) 會在/data/misc目錄下生成一個以pidXXX.hprof結尾的hprof檔案。
c) 然後通過adb pull或其他方式將這個檔案匯出來即可。
(2)問題:
可以匯出內容,但是麼有.hprof檔案呢???
註解:
777=4+2+1 4+2+1 4+2+1
使用者 組 其他
chmod 777 file 給一個檔案改許可權
總結:
(1)暫時總結了4種抓取檔案的方法,1和4是不需要轉化的,2和3需要轉化才可以員工MAT開啟;
(2)沒有問題的可以實施的是方法1、2和3;
(3)方法4 :問題不知道那個程序;
(4)命令還可以抓取但是未實現,不知道問啥?