0抓狭、top命令
Tasks: 552 total, 1 running, 510 sleeping, 0 stopped, 0 zombie
任務(wù)(進程) 系統(tǒng)現(xiàn)在共有552個進程伦泥,其中處于運行中的有1個胸竞,510個在休眠(sleep)斥季,stoped狀態(tài)的有0個训桶,zombie狀態(tài)(僵尸)的有0個。
Mem: 5849960k total, 4014628k used, 1835332k free, 5756k buffers
內(nèi)存狀態(tài): 物理內(nèi)存總量 (5.6G) 使用中的內(nèi)存總量 空閑內(nèi)存總量 緩存的內(nèi)存量
1TB=1024GB ,1GB=1024MB ,1MB=1024KB ,1KB=1024字節(jié)酣倾。
Swap: 2293756k total, 1039804k used, 1253952k free, 918600k cached
swap交換分區(qū): 交換區(qū)總量 使用的交換區(qū)總量 空閑交換區(qū)總量 緩沖的交換區(qū)總量
如果出于習(xí)慣去計算可用內(nèi)存數(shù)舵揭,這里有個近似的計算公式:
Mem的free + Mem的buffers + Swap的cached
按這個公式此臺服務(wù)器的可用內(nèi)存:1835332k + 5756k + 918600k = 2759688k(約2.6G)
800%cpu 13%user 0%nice 31%sys 756%idle 0%iow 0%irq 0%sirq 0%host
cpu狀態(tài)
800%cpu -- CPU總量
13%user -- 用戶空間占用CPU的百分比。
0%nice -- 改變過優(yōu)先級的進程占用CPU的百分比
31%sys -- 內(nèi)核空間占用CPU的百分比
756%idle -- 空閑CPU百分比
0%iow -- IO等待占用CPU的百分比
0%irq -- 硬中斷(Hardware IRQ)占用CPU的百分比
0%sirq -- 軟中斷(Software Interrupts)占用CPU的百分比
0%host --
PID — 進程id
USER — 進程所有者
PR — 進程優(yōu)先級
NI — nice值躁锡。負值表示高優(yōu)先級午绳,正值表示低優(yōu)先級
VIRT — 進程使用的虛擬內(nèi)存總量,單位kb稚铣。VIRT=SWAP+RES
RES — 進程使用的箱叁、未被換出的物理內(nèi)存大小,單位kb惕医。RES=CODE+DATA
SHR — 共享內(nèi)存大小耕漱,單位kb
S — 進程狀態(tài)。D=不可中斷的睡眠狀態(tài) R=運行 S=睡眠 T=跟蹤/停止 Z=僵尸進程
%CPU — 上次更新到現(xiàn)在的CPU時間占用百分比
%MEM — 進程使用的物理內(nèi)存百分比
TIME+ — 進程使用的CPU時間總計抬伺,單位1/100秒
COMMAND — 進程名稱(命令名/命令行)
PID USER PR NI VIRT RES SHR S[%CPU] %MEM TIME+ ARGS ?[0m
shell 20 0 10M 2.4M 1.5M R 25.0 0.0 0:00.08 top
u0_a21 20 0 4.5G 27M 23M S 9.3 0.4 0:02.56 com.google.android.gms.unstable
root 20 0 0 0 0 S 3.1 0.0 0:01.81 [kworker/u16:4]
root 20 0 0 0 0 S 3.1 0.0 0:03.28 [kworker/2:1]
system 18 -2 4.9G 184M 90M S 3.1 3.2 417:44.25 system_server
- 在Log信息中
當程序運行垃圾回收的時候螟够,會打印一條Log信息,其格式如下:
D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time>
GC_Reason表示導(dǎo)致垃圾回收的原因以及當前的回收類型,包括以下幾類:
GC_CONCURRENT:當堆中對象數(shù)量達到一定是觸發(fā)的垃圾收集
GC_FOR_MALLOC:在內(nèi)存已滿的情況下分配內(nèi)存妓笙,此時系統(tǒng)會暫停程序并回收內(nèi)存
GC_HPROF_DUMP_HEAP:創(chuàng)建FPFOR文件來分析Heap時所造成的垃圾收集
GC_EXPLICIT: 程序調(diào)用了垃圾收集函數(shù)System.gc
GC_EXTERNAL_ALLOC: 出現(xiàn)在API 10及以下若河,為外部分配內(nèi)存(native memory or NIO buffer)所造成的垃圾回收,高版本全部分配在Dalvik Heap中寞宫。
Amount_freed 表示此次回收的內(nèi)存
Heap_stats 表示空閑內(nèi)存百分比和存活對象大小/堆的總大小
External_memory_stats 表示API 10及以下的外部分配內(nèi)存萧福,已分配內(nèi)存/導(dǎo)致垃圾回收的界限
Pause_time 暫停時間,一個表示開始回收垃圾的時間辈赋,另一個表示回收結(jié)束的暫停時間
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
注意這條信息中的 “ 3571K/9991K” 值鲫忍,這代表著程序使用的heap大小。
2.使用DDMS
Eclipse中的DDMS提供了一個觀察內(nèi)存使用情況的GUI钥屈,當我們不斷點擊Cause GC時悟民,就會看到當前程序的Heap,使用比較方便篷就,具體用法可以Google一下射亏。
3.使用adb dumpsys 命令
adb是一個非常強大的工具,使用adb查看應(yīng)用程序內(nèi)存使用情況可按如下格式在命令行里查看內(nèi)存使用情況:
adb shell dumpsys meminfo <package_name>
其中竭业,package_name 也可以換成程序的pid智润,pid可以通過 adb shell top | grep app_name 來查找,下圖是某個程序的內(nèi)存使用情況:
重點關(guān)注如下幾個字段:
(1) Native/Dalvik 的 Heap 信息
具體在上面的第一行和第二行永品,它分別給出的是JNI層和Java層的內(nèi)存分配情況做鹰,如果發(fā)現(xiàn)這個值一直增長,則代表程序可能出現(xiàn)了內(nèi)存泄漏鼎姐。
(2) Total 的 PSS 信息
這個值就是你的應(yīng)用真正占據(jù)的內(nèi)存大小钾麸,通過這個信息,你可以輕松判別手機中哪些程序占內(nèi)存比較大了炕桨。
4. 使用adb shell procrank
手機中的sh是經(jīng)過精簡過的饭尝,有些手機可能沒有 procrank 命令,可以使用genymotion模擬器献宫,或是自己安裝procrank命令钥平。使用procrank時,命令行的輸出入下圖:
可以看到姊途,在linux下表示內(nèi)存的耗用情況有四種不同的表現(xiàn)形式:
VSS - Virtual Set Size 虛擬耗用內(nèi)存(包含共享庫占用的內(nèi)存)
RSS - Resident Set Size 實際使用物理內(nèi)存(包含共享庫占用的內(nèi)存)
PSS - Proportional Set Size 實際使用的物理內(nèi)存(比例分配共享庫占用的內(nèi)存)
USS - Unique Set Size 進程獨自占用的物理內(nèi)存(不包含共享庫占用的內(nèi)存)
VSS:VSS表示一個進程可訪問的全部內(nèi)存地址空間的大小涉瘾。這個大小包括了進程已經(jīng)申請但尚未使用的內(nèi)存空間。在實際中很少用這種方式來表示進程占用內(nèi)存的情況捷兰,用它來表示單個進程的內(nèi)存使用情況是不準確的立叛。
RSS:表示一個進程在RAM中實際使用的空間地址大小,包括了全部共享庫占用的內(nèi)存贡茅,這種表示進程占用內(nèi)存的情況也是不準確的秘蛇。
PSS:表示一個進程在RAM中實際使用的空間地址大小其做,它按比例包含了共享庫占用的內(nèi)存。假如有3個進程使用同一個共享庫赁还,那么每個進程的PSS就包括了1/3大小的共享庫內(nèi)存妖泄。這種方式表示進程的內(nèi)存使用情況較準確,但當只有一個進程使用共享庫時艘策,其情況和RSS一模一樣蹈胡。
USS:表示一個進程本身占用的內(nèi)存空間大小,不包含其它任何成分柬焕,這是表示進程內(nèi)存大小的最好方式审残!
可以看到:VSS>=RSS>=PSS>=USS
5.其它常用命令命令:
adb shell kill PIDNumber 死你想殺死的后臺進程來模擬某種 bug 的復(fù)現(xiàn)條件梭域。
adb shell ps 查看當前終端中的進程信息
那么如何在代碼中判斷當前的硬件系統(tǒng)有多少的 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