1. 在IDE中查看Log信息
當程序運行垃圾回收的時候,會打印一條Log信息,其格式以下:
D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time>
GC_Reason表示致使垃圾回收的緣由以及當前的回收類型,包括如下幾類:
GC_CONCURRENT:當堆中對象數量達到必定是觸發的垃圾收集
GC_FOR_MALLOC:在內存已滿的狀況下分配內存,此時系統會暫停程序並回收內存
GC_HPROF_DUMP_HEAP:建立FPFOR文件來分析Heap時所形成的垃圾收集
GC_EXPLICIT: 程序調用了垃圾收集函數System.gcjava
GC_EXTERNAL_ALLOC: 出如今API 10及如下,爲外部分配內存(native memory or NIO buffer)所形成的垃圾回收,高版本所有分配在Dalvik Heap中。linux
Amount_freed 表示這次回收的內存
Heap_stats 表示空閒內存百分比和存活對象大小/堆的總大小
External_memory_stats 表示API 10及如下的外部分配內存,已分配內存/致使垃圾回收的界限
Pause_time 暫停時間,一個表示開始回收垃圾的時間,另外一個表示回收結束的暫停時間
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
注意這條信息中的 「 3571K/9991K」 值,這表明着程序使用的heap大小。shell
2.使用DDMS
Eclipse中的DDMS提供了一個觀察內存使用狀況的GUI,當咱們不斷點擊Cause GC時,就會看到當前程序的Heap,使用比較方便,具體用法能夠Google一下。app
3.使用adb dumpsys 命令
adb是一個很是強大的工具,使用adb查看應用程序內存使用狀況可按以下格式在命令行裏查看內存使用狀況:
adb shell dumpsys meminfo <package_name>
其中,package_name 也能夠換成程序的pid,pid能夠經過 adb shell top | grep app_name 來查找,下圖是某個程序的內存使用狀況:
重點關注以下幾個字段:
(1) Native/Dalvik 的 Heap 信息
具體在上面的第一行和第二行,它分別給出的是JNI層和Java層的內存分配狀況,若是發現這個值一直增加,則表明程序可能出現了內存泄漏。
(2) Total 的 PSS 信息
這個值就是你的應用真正佔據的內存大小,經過這個信息,你能夠輕鬆判別手機中哪些程序佔內存比較大了。ide
4. 使用adb shell procrank
手機中的sh是通過精簡過的,有些手機可能沒有 procrank 命令,可使用genymotion模擬器,或是本身安裝procrank命令。使用procrank時,命令行的輸出入下圖:函數
能夠看到,在linux下表示內存的耗用狀況有四種不一樣的表現形式:
VSS - Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存)
RSS - Resident Set Size 實際使用物理內存(包含共享庫佔用的內存)
PSS - Proportional Set Size 實際使用的物理內存(比例分配共享庫佔用的內存)
USS - Unique Set Size 進程獨自佔用的物理內存(不包含共享庫佔用的內存)工具
VSS:VSS表示一個進程可訪問的所有內存地址空間的大小。這個大小包括了進程已經申請但還沒有使用的內存空間。在實際中不多用這種方式來表示進程佔用內存的狀況,用它來表示單個進程的內存使用狀況是不許確的。
RSS:表示一個進程在RAM中實際使用的空間地址大小,包括了所有共享庫佔用的內存,這種表示進程佔用內存的狀況也是不許確的。
PSS:表示一個進程在RAM中實際使用的空間地址大小,它按比例包含了共享庫佔用的內存。假若有3個進程使用同一個共享庫,那麼每一個進程的PSS就包括了1/3大小的共享庫內存。這種方式表示進程的內存使用狀況較準確,但當只有一個進程使用共享庫時,其狀況和RSS如出一轍。
USS:表示一個進程自己佔用的內存空間大小,不包含其它任何成分,這是表示進程內存大小的最好方式!
能夠看到:VSS>=RSS>=PSS>=USS命令行
5.其它經常使用命令命令:
adb shell kill PIDNumber 死你想殺死的後臺進程來模擬某種 bug 的復現條件。
adb shell ps 查看當前終端中的進程信息
那麼如何在代碼中判斷當前的硬件系統有多少的 RAM 呢?在 Framework ProcessList.java 中有以下代碼可用:
ProcessList() {
MemInfoReader minfo = new MemInfoReader();
minfo.readMemInfo();
mTotalMemMb = minfo.getTotalSize()/(1024*1024);
}
查看進程佔用cpu的狀況:adb shell top -n 1 -d 0.5 | grep proc_ id對象