文章目錄
- 一、查看top命令
- Android N(7.1系統,level = 25) 及之前
- Android O(8.0系統,level = 26) 及之后
- 二、top -n [number]
- Android N(7.1系統,level = 25) 及之前
- Android O(8.0系統,level = 26) 及之后
- 三、代碼實現
- 輸出日志
一、查看top命令
首先執行:
abd shell
然后執行:
top --help
注:不同的Android系統,top命令有所不同。
Android N(7.1系統,level = 25) 及之前
Invalid argument "-p".
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]-m num Maximum number of processes to display.-n num 顯示n次top的結果后命令就會退出,例如:top -n 1-d num Seconds to wait between updates.-s col Column to sort by (cpu,vss,rss,thr).-H Show threads instead of processes.-h Display this help screen.
Android O(8.0系統,level = 26) 及之后
usage: top [-Hbq] [-k FIELD,] [-o FIELD,] [-s SORT] [-n NUMBER] [-m LINES] [-d SECONDS] [-p PID,] [-u USER,]Show process activity in real time.-H Show threads
-k Fallback sort FIELDS (default -S,-%CPU,-ETIME,-PID)
-o Show FIELDS (def PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,CMDLINE)
-O Add FIELDS (replacing PR,NI,VIRT,RES,SHR,S from default)
-s 選擇根據某項(cpu,vss,rss,thr)來排序
-b Batch mode (no tty)
-d 更新的時間間隔,默認是每隔3s更新下狀態,top -d 0時會持續地輸出,不過很占CPU。
-m 顯示的最多進程數,做優化時一般只關心CPU占用率最高的幾個進程,那么只需要top -m 3或top -m 5就好了,以免top命令的輸出太多
-n 顯示n次top的結果后命令就會退出,例如:top -n 1
-p 顯示進程信息,例如:top -p [pid]
-u Show these USERs
-q Quiet (no header lines)Cursor LEFT/RIGHT to change sort, UP/DOWN move list, space to force
update, R to reverse sort, Q to exit.
二、top -n [number]
Android N(7.1系統,level = 25) 及之前
[hwbeethoven:/ $ top -n 1 // CPU占用率:User 用戶進程;System 系統進程;IOW IO等待時間;IRQ 硬中斷時間
User 8%, System 9%, IOW 0%, IRQ 0%
// CPU使用情況:
// User 處于用戶態的運行時間,不包含優先值為負進程
// Nice 優先值為負的進程所占用的CPU時間
// Sys 處于核心態的運行時間
// Idle 除IO等待時間以外的其它等待時間
// IOW IO等待時間
// IRQ 硬中斷時間
// SIRQ 軟中斷時間
User 5 + Nice 0 + Sys 6 + Idle 50 + IOW 0 + IRQ 0 + SIRQ 0 = 61
// 進程屬性:
// PID 進程在系統中的ID
// CPU% 當前瞬時所以使用CPU占用率
// S 進程的狀態,其中S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值是負數。
// #THR 程序當前所用的線程數
// VSS Virtual Set Size 虛擬耗用內存(包含共享庫占用的內存)
// RSS Resident Set Size 實際使用物理內存(包含共享庫占用的內存)
// PCY Policy系統對這個進程/線程的調度策略,bg 后臺;fg 前臺
// Name 程序名稱PID USER PR NI CPU% S #THR VSS RSS PCY Name
21548 shell 20 0 9% R 1 9128K 1908K fg top2 root 20 0 0% S 1 0K 0K fg kthreadd3 root 20 0 0% S 1 0K 0K fg ksoftirqd/05 root 0 -20 0% S 1 0K 0K fg kworker/0:0H7 root 20 0 0% S 1 0K 0K fg rcu_preempt8 root 20 0 0% S 1 0K 0K fg rcu_sched9 root 20 0 0% S 1 0K 0K fg rcu_bh10 root RT 0 0% S 1 0K 0K fg migration/011 root RT 0 0% S 1 0K 0K fg watchdog/012 root RT 0 0% S 1 0K 0K fg watchdog/113 root RT 0 0% S 1 0K 0K fg migration/114 root 20 0 0% S 1 0K 0K fg ksoftirqd/1
注:內存占用大小有如下規律:
VSS
>= RSS
>= PSS
>= USS
-
VSS
:Virtual Set Size 虛擬耗用內存(包含共享庫占用的內存) -
RSS
:Resident Set Size 實際使用物理內存(包含共享庫占用的內存) -
PSS
:Proportional Set Size 實際使用的物理內存(比例分配共享庫占用的內存) -
USS
:Unique Set Size 進程獨自占用的物理內存(不包含共享庫占用的內存)
Android O(8.0系統,level = 26) 及之后
[HWHRY-HF:/ $ top -n 1 // 進程數(Tasks)
Tasks: 589 total, 1 running, 546 sleeping, 0 stopped, 0 zombie
// 內存使用信息
Mem: 5859784k total, 5741324k used, 118460k free, 5520k buffers
// 交換區使用信息
Swap: 2293756k total, 696260k used, 1597496k free, 2407216k cached
// cpu使用信息
800%cpu 83%user 3%nice 73%sys 630%idle 0%iow 7%irq 3%sirq 0%host
// PID 進程在系統中的ID
// VIRT virtual memory usage 虛擬內存
// 1、進程“需要的”虛擬內存大小,包括進程使用的庫、代碼、數據等
// 2、假如進程申請100m的內存,但實際只使用了10m,那么它會增長100m,而不是實際的使用量
// RES resident memory usage 常駐內存
// 1、進程當前使用的內存大小,但不包括swap out
// 2、包含其他進程的共享
// 3、如果申請100m的內存,實際使用10m,它只增長10m,與VIRT相反
// 4、關于庫占用內存的情況,它只統計加載的庫文件所占內存大小
// SHR shared memory 共享內存
// 1、除了自身進程的共享內存,也包括其他進程的共享內存
// 2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小
// 3、計算某個進程所占的物理內存大小公式:RES – SHR
// 4、swap out后,它將會降下來
// S 進程的狀態,其中S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值是負數。
// [%CPU] 當前瞬時所以使用CPU占用率
// %MEM 表示內存使用百分比
// ARGS 程序名稱 PID USER PR NI VIRT RES SHR S[%CPU] %MEM TIME+ ARGS
13613 u0_a304 10 -10 4.3G 82M 52M S 46.6 1.4 0:11.43 com.cloudwise.ndk
18873 shell 20 0 12M 2.4M 1.6M R 33.3 0.0 0:00.05 top -n 1601 system -2 -8 2.4G 18M 8.3M S 23.3 0.3 66:49.50 surfaceflinger583 system 20 0 22M 2.7M 1.9M S 13.3 0.0 16:35.51 vendor.huawei.hardware.hwdisplay.displayengine@1.2-service569 system -3 -8 2.1G 3.8M 3.1M S 13.3 0.0 25:59.26 android.hardware.graphics.composer@2.2-service1370 system 18 -2 5.1G 199M 199M S 10.0 3.4 274:28.21 system_server662 root RT 0 28M 2.8M 2.1M S 10.0 0.0 16:37.07 aptouch_daemon
18760 shell 20 0 20M 732K 732K S 6.6 0.0 0:00.94 adbd --root_seclabel=u:r:su:s0
18857 shell 20 0 12M 2.4M 1.5M S 3.3 0.0 0:00.34 logcat -v long
18562 root 20 0 0 0 0 S 3.3 0.0 0:00.17 [kworker/u16:3]
如果只想看某一個進程的信息的話,可執行如下命令:
top -n 1 -p [pid]
注:該命令只適用于Android O(level = 26) 及之后的系統
,level = 25之前的系統沒有 -p
命令。
三、代碼實現
private void sysInfo(){new Thread(new Runnable() {@Overridepublic void run() {try {// 查詢某一個進程的信息List<String> cmds = new ArrayList<String>();cmds.add("top");cmds.add("-n");cmds.add("1");if(Build.VERSION.SDK_INT >= 26){cmds.add("-p");cmds.add(android.os.Process.myPid()+"");}ProcessBuilder pb = new ProcessBuilder(cmds);Process p = pb.start();//Process p = Runtime.getRuntime().exec("top -n 1 -p " + android.os.Process.myPid());BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));StringBuilder sb = new StringBuilder();String line;while ((line = br.readLine()) != null){sb.append(line).append("\n");}Log.e("CLOUDWISE","Sys : " + sb.toString());} catch (Exception ex){ex.printStackTrace();Log.e("CLOUDWISE","Exception : " + ex.toString());}}}).start();}
輸出日志
Android O(8.0系統,level = 26) 及之后日志:
[?25l[0m[H[J[s[999C[999B[6n[uTasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Mem: 5859784k total, 5671728k used, 188056k free, 4292k buffers Swap: 2293756k total, 732988k used, 1560768k free, 2288768k cached 800%cpu 0%user 0%nice 0%sys 800%idle 0%iow 0%irq 0%sirq 0%host [7m PID USER PR NI VIRT RES SHR S[%CPU] %MEM TIME+ ARGS [0m23669 u0_a309 10 -10 4.2G 90M 56M S 4.0 1.5 0:02.58 com.tsb[?25h[0m[1000;1H[K[?25h[0m[1000;1H[K
Android N(7.1系統,level = 25) 及之前日志:
User 0%, System 0%, IOW 0%, IRQ 0%User 0 + Nice 0 + Sys 0 + Idle 1 + IOW 0 + IRQ 0 + SIRQ 0 = 1PID USER PR NI CPU% S #THR VSS RSS PCY Name7975 u0_a276 20 0 0% R 1 9128K 1656K ta top7702 u0_a276 20 0 0% S 38 2373700K 109416K ta com.tsb