工作中遇到挺多需要分析內存泄漏問題的情況,現在大致扼要寫下思路,等以后時間相對照較充裕再進行補充。
1.明白內存泄漏的判斷根據?
個人總結為:延續增加,只增不減!
理解1下這8個字,配合幾個命令和工具來肯定1下你的利用是不是存在內存泄漏問題,這是很關鍵的,如果1開始就判斷毛病了,那末沒有繼續往下進行的理由。
命令以下:
adb shell
dumpsys meminfo 利用包名 [固然,比較粗略地話,可以用adb shell procrank]
這時候候你可以看到1個內存使用情況表
而我們首先關注的是TOTAL這個值,比方你會履行某個腳本,或Monkey在不斷操作你的利用,你可以隔半個小時視察1次TOTAL的情況,如果延續增加,那末10有89是有內存泄漏的問題了,但是也其實不是絕對,這時候候你就要配合上DDMS工具來做分析了。(DDMS里面有1項Heap,里面可以Cause GC,如果你發現你履行了GC以后,照舊內存沒有甚么太大的減少,那末恭喜你,這部份內存泄漏了。)
2.根據第1步所論述的1個情況,大概可以判斷出是不是有內存泄漏,那末接著需要做甚么呢?
如果內存泄漏,那末我們該做些甚么呢?
思路:一定我們想要找到泄漏點,那末如何找到?
(1). 你需要抓取hprof文件,這個文件可以顯現出1些內存的使用情況,不過切記,你別清除進程再來抓這個文件,然后配合著MAT把這個hprof文件分析了
(MAT分析hprof文件的這方面知識網上太齊全了,讀者們可以自己去學習1下哈,這里就不累墜)
(2).如果MAT分析出來的東東,你實在看不出甚么貓膩,那末再次恭喜你,你中大招了。
這時候候你要繼續視察dumpsys meminfo 包名, 輸出的結果信息,關注點放在 UnKnown那1行 和 Native Heap 那1行,關注Heap Alloc 或 Pss Total,
如果你的總TOTAL1直再增加,但是是由于這兩行的增加,那末這個問題你不需要再繼續在MAT上花時間了,由于這類內存泄漏問題,出在Native層(C)
那末你需要去找你程序中使用到JNI的地方,so庫或其他1些特殊調用上,分析它們是不是可能造成內存泄漏問題。
(3)固然興許你照舊沒有頭緒,那末沒關系,另外一個命令就是為了你而存在的,(首先某個利用的PID號, 用dumpsys meminfo 包名,那邊已可以查到)
比方我上面那個mms, PID號為2786, 接著adb shell showmap -a PID號 (adb shell showmap -a 2786)
然后根據結果[....]這的信息,在去google上面找關鍵字, 比方:[ anon ] bash的堆
(4)當你終究還是不知道是由哪邊的.so庫引發的話,你可以查看下Native Heap的內存分配情況,這時候候你照舊需要借助DDMS,
需要先履行以下命令:
adb shell setprop libc.debug.malloc 1
adb shell stop
adb shell start
然后你還需要改1下eclipse中的配置參數值【由于如果你不配置的話,你的DDMS打開默許是看不到Native Heap那個Tab項的】
在ddms.cfg文件(實在找不到的話,就用Everything搜索下吧)最后增加1行native=true并save。ddms.cfg位于c:Usersxxx.android目錄下。
在Device當選擇好你要的利用的包名項,然后按下Snapshot按鈕, 就能夠視察到Native Heap的使用情況了,然后反復履行腳本,再視察視察,你會找到你需要的東西的。
(5)內存泄漏的問題可能很復雜,但是有的時候有了這些技能,相對更重要。所以第(5)小點,額外再提供1些其他的命令技能,幫助查找另外的情況出現內存泄漏的問題。
1. adb shell dumpsys activity 查詢activity棧的情況(曾遇到過,就是activity1直堆積,致使的內存溢出OOM)
2. adb shell dumpsys cpuinfo
3. adb shell dumpsys battery
如果你在這方面有自己其他的1些方法,那末也無妨留言跟大家分享下!
轉載請注明:http://blog.csdn.net/ljphhj/article/details/44966023
轉載于 胖虎 CSDN