Android 進程監控(top命令)

文章目錄

    • 一、查看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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446882.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446882.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446882.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 快速排序

快速排序 對冒泡排序的一種改進 思路: 一趟排序后,選取一個中間值,數組被分為比中間值小的部分,比中間值大的部分;再對左右兩部分分別遞歸排序 代碼實現 import java.util.Arrays;public class QuickSort {public static void main(String[] args) {int[] arr {-9, 78, 0, 2…

C++字符串的個人理解

String string是字符串&#xff0c;在聲明一個字符串的時候&#xff0c;比如string a;這個過程是在棧上進行的&#xff0c;但是如果給這個字符串分配內存空間&#xff0c;這段區間是存儲在堆上的&#xff0c;因此最好在聲明字符串的時候就要指出字符串的大小和對其進行初始化s…

Android 基礎性能數據獲取(/proc/)

一、系統內存 讀取命令&#xff1a; /proc/meminfoJava代碼&#xff1a; private void click(){try{String cmd "/proc/meminfo";BufferedReader reader new BufferedReader(new InputStreamReader(new FileInputStream(cmd)), 1000);StringBuilder sb new Stri…

物理 常見力與牛頓三定律

常用知識點 動量 dmvdmvdvm p-mv- f-dp-/dtma- 開普勒第三定律 r1^3__k只與恒星質量有關 T^2 總結 1.電梯勻速就相當于在地面,加速或減速就會有一個a 2.當合外力為0時,物體保持靜止或勻速直線運動 3.力是改變物體運動狀態的原因 4.重力在地球兩極最大,赤道最小,隨緯度…

Java命令:jmap — 打印指定進程的共享對象內存映射或堆內存細節

文章目錄一、前言二、命令介紹三、使用實例1、jmap -heap [pid]2、jmap -histo[:live] [pid]3、jmap -histo[:live] [pid] |grep "[關鍵字1]\|[關鍵字2]"4、jmap -dump:live,formatb,filea.log [pid]四、總結一、前言 jdk安裝后會自帶一些小工具&#xff0c;jmap命令…

C++vector相關學習,我的理解

vector的初始化方式 1&#xff0c;使用拷貝初始化時候&#xff0c;即使用的時候&#xff0c;只可以提供一個初始值2&#xff0c;如果提供一個類內初始值&#xff0c;只可以使用拷貝初始化或者使用花括號的方式初始化3&#xff0c;如果提供的是初始元素值的列表&#xff0c;只可…

概率論 一維隨機變量

隨機變量 離散型隨機變量:有限個或無限可列個 連續型隨機變量 分布函數F(X) 范圍是[a,b) 包含能取到a以及a之前的值的概率相加 分布律(概率分布) 1.所有概率相加為1 2.WX-1,計算出每一個對應的W,然后如果有相同的W就合并其概率,最后一一對應P(x)即可 概率密度函數(密度) …

Linux命令:grep命令詳解

grep常用參數說明 grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN]... [-f FILE]... [FILE...]OPTIONS:-e: 使用正則搜索-i: 不區分大小寫-v: 查找不包含指定內容的行-w: 按單詞搜索-c: 統計匹配到的次數-n: 顯示行號-r: 逐層遍歷目錄查找-A: 顯示匹配行及后…

ECC密鑰結構和密碼學基礎

參考鏈接 密碼學基礎3&#xff1a;密鑰文件格式完全解析ECC數據結構

JAVA牛客專項練習2020.12.31

1.使用迭代器的remove方法&#xff0c;可以邊遍歷邊刪除元素 2.線程 啟動線程 new thread&#xff08;&#xff09;.start&#xff08;&#xff09; new thread&#xff08;new runnable&#xff08;&#xff09;&#xff09;.start&#xff08;&#xff09; 普通方法&#xf…

Linux命令:find命令詳解

find命令格式 find path -option [-print] [-exec -ok |xargs |grep] [command {} \;]# 參數說明path: find命令所查找的目錄路徑。~ 表示$HOME目錄;.來表示當前目錄;/來表示系統根目錄。-print: find命令將匹配的文件輸出到標準輸出。-exec: find命令對匹配的文件執行該參數所…

boost::interprocess::named_mutex的翻譯和學習

官方地址 named_mutex 簡介 // In header: <boost/interprocess/sync/named_mutex.hpp>class named_mutex { public:// construct/copy/destruct 構建/復制/銷毀named_mutex(create_only_t, const char *, const permissions & permissions());named_mutex(open_o…

安卓牛客專項練習2020.12.31

1.窗口dialog或半透明 2.Pracelable性能比serializable高

MAC查找JDK的路徑

在控制臺中輸入&#xff1a; /usr/libexec/java_home -V輸出如下結果&#xff1a; Matching Java Virtual Machines (4):1.8.0_121, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home1.7.0_79, x86_64: "Java SE 7&quo…

sqliteorm的sync_schema介紹

遷移功能 在遷移過程中&#xff0c;沒有明確的上下函數。取而代之的是sqlite_orm提供的sync_schema函數&#xff0c;它負責將實際的db文件模式和你在make_storage調用中指定的模式進行比較&#xff0c;如果有什么不一樣&#xff0c;它就會改變或放棄/創建模式。 storage.sync_…

安卓系統體系架構

1.大體:共有四層&#xff0c;系統應用層&#xff0c;JAVA API層&#xff0c;安卓系統運行層&#xff0c;Linux內核層 具體: 系統應用層&#xff08;System Apps&#xff09; Java API 框架層&#xff08;Java API Framework&#xff09; Android系統運行層&#xff08;包括Andr…

Java命令:jstack — 獲取線程dump信息

目錄一、命令介紹二、使用實例實例一&#xff1a;jstack查看輸出實例二&#xff1a;jstack統計線程數實例三&#xff1a;jstack檢測死鎖實例四&#xff1a;jstack檢測CPU高一、命令介紹 Usage:jstack [-l] <pid>(to connect to running process) //連接活動線程jstack …

Java多線程死鎖例子

目錄一、產生死鎖的原因二、如何避免死鎖一、產生死鎖的原因 發生死鎖的情況&#xff1a; 多個線程需要同時占用多個共享資源而發生需要互相死循環等待的情況&#xff0c;就是&#xff0c;兩個線程互相等待著對象釋放鎖&#xff0c;一直這樣僵持下去&#xff0c;所以導致了死鎖…

C++中lock_guard的學習

lock_guard 鎖守衛是一個管理mutex對象的對象&#xff0c;使其始終處于鎖定狀態。在構造時&#xff0c;mutex對象被調用線程鎖定&#xff0c;在銷毀時&#xff0c;mutex被解鎖。這是最簡單的鎖&#xff0c;作為一個自動持續時間的對象&#xff0c;它的作用特別大&#xff0c;可…

安卓四大組件簡介

安卓四大組件 Activity活動&#xff0c;Service服務&#xff0c;BroadcastRecevicer廣播接受器&#xff0c;Content Provider內容提供者 Activity活動 所有程序的流程都運行在activity中 Service服務 只能后臺運行&#xff0c;沒有界面的長生命周期的代碼 BroadcastRece…