Android内存分析
最近簡單學些了android內存分析,下面為一些學習筆記和整理。
?
一、內存數據的獲取
1. 查看手機系統內存信息
adb pull /system/build.prop
打開build.prop可以查看堆分配的一些信息:
?
2. VSS RSS USS PSS獲取
首先理解一下它們的含義:
VSS – Virtual Set Size 虛擬耗用內存(包含共享庫占用的內存)
RSS – Resident Set Size 實際使用物理內存(包含共享庫占用的內存)
PSS – Proportional Set Size 實際使用的物理內存(比例分配共享庫占用的內存)
USS – Unique Set Size 進程獨自占用的物理內存(不包含共享庫占用的內存)
一般來說內存占用大小有如下規律:VSS >= RSS >= PSS >= USS
?
下面介紹各項的獲取方法:
1)VSS和RSS
adb shell top命令,獲取到的信息列分別為:
PID(進程ID) ?CPU%(CPU占用率) #THR(程序線程數) ? VSS ? ? RSS ? UID(用戶ID) ? ? ?Name(程序名)
?
2)PSS
adb shell dumpsys meminfo [package-name]
?
3)USS
USS的獲取必須要通過procrank。首先到網上下載libpagemap.so,?procmem,?procrank這幾個文件(下載地址在網上找了好久,先賣個關子~~),然后push到android手機中。有的root機自帶這幾個文件,不需要額外下載。
adb push procrank /system/xbin adb push procmem /system/xbin adb push libpagemap.so /system/lib然后賦予賦權:
adb shell chmod 6755 /system/xbin/procrank adb shell chmod 6755 /system/xbin/procmem adb shell chmod 6755 /system/lib/libpagemap.so后面就可以用adb shell procrank命令了,該命令可以查看PID VSS RSS PSS USS所有數據。
?
二、內存分析
內存分析的工具有android studio、 DDMS monitor。隨著android studio版本的演進,功能也集成得越來越多,建議大家使用最新的android studio。
?
1. 查看內存占用趨勢圖
可以看到內存隨著時間變化趨勢。
?
2. dump java heap
點擊dump java heap,即會自動打開一個hprof文件,即為當前的java heap分配snapshot,可以按size排序。展示方式有class list view 和 package tree view。選擇一個class,右側instance中會列出所有instance變量,選擇一個instance,下方reference tree即展現該instance的引用過程。右擊即可直接跳到源碼。
上圖中所有量的含義如下:
左側class panel中:
- Total Count 內存中該類的對象個數;
- Heap Count 堆內存中該類的對象個數;
- Sizeof 物理大小;
- Shallow size 該對象本身占有內存大小;
- Retained Size 釋放該對象后,節省的內存大小;
右側instance panel中:
- depth 深度;
- Shallow Size 對象本身內存大小;
- Dominating Size 管轄的內存大小;
?
3. 內存分配跟蹤 allocation tracking
第一次點擊allocation tacking,即start allocation tracking,在手機上操作之后,再點擊一次即stop allocation tracking,然后會自動打開一個內存跟蹤alloc文件。可以group by Method或者allocator,Size就是內存大小,Count就是分配了多少次內存,可以一步步迭代到最底部。同樣的右擊可以定位到源碼。
點擊group by allocator右邊的彩色圖標,可以查看統計信息。隨著鼠標的移動,右側的信息實時展示,并且可以點擊分析局部。
?
另外android monitor中同樣可以跟蹤內存分配情況,作用基本上和android studio中使用一致,但是展示方式不一樣。android studio -> tools -> android -> android device monitor,即可打開monitor。
選擇待測試手機和進程,點擊start?tracking,手機上執行操作,點擊get allocations. 同樣的可以看到內存分配大小、分配對象、以及具體的分配順序。
?
三、內存泄漏、內存溢出
另外,順便說一下內存泄漏和內存溢出。
內存溢出就是應用的內存超過閾值了,主要原因有:
內存溢出的判斷直接看實時日志OutOfMemoryError,但是具體分析需要通過allocation tracking追蹤之前的內存分配情況。
?
內存泄漏即當對象本該被回收的時候還被其他對象所持有引用,導致應用長時間運行之后,所占用的內存越來越大,app卡頓或者crash。
內存泄漏的分析可以借助1)dump java heap + memory analysis tool (MAT) ;2)leakcanary;3)android studio最新版本也集成了內存泄漏檢測,可以嘗試一下。
?
參考網址:
http://blog.csdn.net/yanbober/article/details/48394201
http://developer.android.com/intl/ko/tools/debugging/debugging-memory.html
http://blog.csdn.net/itfootball
原文地址: http://www.dzwanli.com.cn/?p=1464
總結
以上是生活随笔為你收集整理的Android内存分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度增强学习前沿算法思想
- 下一篇: Linux Used内存到底哪里去了?