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

一、系統內存

讀取命令:

/proc/meminfo

Java代碼:

	private void click(){try{String cmd = "/proc/meminfo";BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(cmd)), 1000);StringBuilder sb = new StringBuilder();String line;while ((line = reader.readLine()) != null){sb.append(line).append("\n");}Log.e("/proc/meminfo : " + sb.toString());reader.close();}catch (Exception ex){ex.printStackTrace();Log.e("click [/proc/meminfo] exception : " + ex.toString());}}

輸出結果:

	MemTotal:        5859784 kBMemFree:          394708 kBMemAvailable:    2660552 kBBuffers:            4640 kBCached:          2209396 kBSwapCached:        58852 kBActive:          2008348 kBInactive:        1365356 kBActive(anon):     897500 kBInactive(anon):   350412 kBActive(file):    1110848 kBInactive(file):  1014944 kBUnevictable:       67908 kBMlocked:           67908 kBSwapTotal:       2293756 kBSwapFree:        1555948 kBDirty:               480 kBWriteback:             0 kBAnonPages:       1207652 kBMapped:           476364 kBShmem:             22764 kBSlab:             339180 kBSReclaimable:     119880 kBSUnreclaim:       219300 kBKernelStack:       55888 kBPageTables:        76060 kBNFS_Unstable:          0 kBBounce:                0 kBWritebackTmp:          0 kBCommitLimit:     5223648 kBCommitted_AS:   99107264 kBVmallocTotal:   263061440 kBVmallocUsed:           0 kBVmallocChunk:          0 kBCmaTotal:         917504 kBCmaFree:           34788 kBIonTotalCache:    165936 kBIonTotalUsed:     195136 kBPActive(anon):         0 kBPInactive(anon):       0 kBPActive(file):         0 kBPInactive(file):       0 kBIsolate1Free:       6276 kBIsolate2Free:       5568 kBRsvTotalUsed:     276484 kB

字段含義說明:

	MemTotal:       所有可用RAM大小。MemFree:        LowFree與HighFree的總和,被系統留著未使用的內存。Buffers:        用來給文件做緩沖大小。Cached:         被高速緩沖存儲器(cache memory)用的內存的大小(等于diskcache minus SwapCache)。SwapCached:     被高速緩沖存儲器(cache memory)用的交換空間的大小。已經被交換出來的內存,仍然被存放在swapfile中,用來在需要的時候很快的被替換而不需要再次打開I/O端口。Active:         在活躍使用中的緩沖或高速緩沖存儲器頁面文件的大小,除非非常必要,否則不會被移作他用。Inactive:       在不經常使用中的緩沖或高速緩沖存儲器頁面文件的大小,可能被用于其他途徑。SwapTotal:      交換空間的總大小。SwapFree:       未被使用交換空間的大小。Dirty:          等待被寫回到磁盤的內存大小。Writeback:      正在被寫回到磁盤的內存大小。AnonPages:     未映射頁的內存大小。Mapped:         設備和文件等映射的大小。Slab:           內核數據結構緩存的大小,可以減少申請和釋放內存帶來的消耗。SReclaimable:   可收回Slab的大小。SUnreclaim:    不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。PageTables:    管理內存分頁頁面的索引表的大小。NFS_Unstable:   不穩定頁表的大小。

系統內存總容量: 只需要讀取“/proc/meminfo”文件的第一個字段“MemTotal”就可以了。

系統空閑的內存: 只需要通過ActivityManager即可獲取。

	//系統空閑內存public static long getSysFreeMemory(Context context) {ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();am.getMemoryInfo(mi);return mi.availMem;}

二、進程內存

進程內存上限:

	//進程內存上限public static int getMemoryMax() {return (int) (Runtime.getRuntime().maxMemory()/1024);}

進程總內存:

	//進程總內存public static int getPidMemorySize(int pid, Context context) {ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);int[] myMempid = new int[] { pid };Debug.MemoryInfo[] memoryInfo = am.getProcessMemoryInfo(myMempid);int memSize = memoryInfo[0].getTotalPss();//        dalvikPrivateDirty: The private dirty pages used by dalvik。//        dalvikPss :The proportional set size for dalvik.//        dalvikSharedDirty :The shared dirty pages used by dalvik.//        nativePrivateDirty :The private dirty pages used by the native heap.//        nativePss :The proportional set size for the native heap.//        nativeSharedDirty :The shared dirty pages used by the native heap.//        otherPrivateDirty :The private dirty pages used by everything else.//        otherPss :The proportional set size for everything else.//        otherSharedDirty :The shared dirty pages used by everything else.return memSize;}

GT3.1開源獲取內存數據代碼:
https://github.com/Tencent/GT/blob/ed3a289a897d0ea14676a7c7d92344f5b398991e/android/GT_APP/app/src/main/java/com/tencent/wstt/gt/api/utils/MemUtils.java


三、CPU篇

CPU :表示進程或線程的繁忙程度

獲取CPU主要用兩種方法:

  • 一種是利用top命令或者dumpsys cpuinfo,
  • 第二種是讀取/proc/stat文件,然后解析相關參數,自己去計算。

下面主要介紹第二種方法,也是個人比較推薦的方法

/proc文件系統是一個偽文件系統,它只存在內存當中,而不占用外存空間。它以文件系統的方式為內核與進程提供通信的接口。用戶和應用程序可以通過/proc得到系統的信息,并可以改變內核的某些參數。由于系統的信息,如進程,是動態改變的,所以用戶或應用程序讀取/proc目錄中的文件時,proc文件系統是動態從系統內核讀出所需信息并提交的。 從proc文件中可以獲取系統、進程、線程的cpu時間片使用情況,所以兩次采集時間片的數據就可以獲取進程CPU占用率, CPU占用率 = (進程T2-進程T1)/(系統T2-系統T1) 的時間片比值。

1、獲取系統CPU時間片

獲取系統CPU時間片使用情況:讀取proc/stat,文件的內容如下:

	cpu 2032004 102648 238344 167130733 758440 15159 17878 0cpu0 1022597 63462 141826 83528451 366530 9362 15386 0cpu1 1009407 39185 96518 83602282 391909 5796 2492 0intr 303194010 212852371 3 0 0 11 0 0 2 1 1 0 0 3 0 11097365 0 72615114 6628960 0 179 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0ctxt 236095529btime 1195210746processes 401389procs_running 1procs_blocked 0

第一行各個字段的含義:

	user (14624) 從系統啟動開始累計到當前時刻,處于用戶態的運行時間,不包含 nice值為負進程。 nice (771) 從系統啟動開始累計到當前時刻,nice值為負的進程所占用的CPU時間 system (8484) 從系統啟動開始累計到當前時刻,處于核心態的運行時間 idle (283052) 從系統啟動開始累計到當前時刻,除IO等待時間以外的其它等待時間 iowait (0) 從系統啟動開始累計到當前時刻,IO等待時間(since 2.5.41) irq (0) 從系統啟動開始累計到當前時刻,硬中斷時間(since 2.6.0-test4) softirq (62) 從系統啟動開始累計到當前時刻,軟中斷時間(since 2.6.0-test4) 

總的cpu時間totalCpuTime = user + nice + system + idle + iowait + irq + softirq

2、獲取進程和線程的CPU時間片

獲取進程CPU時間片使用情況:讀取proc/pid/stat,獲取線程CPU時間片使用情況:讀取proc/pid/task/tid/stat,這兩個文件的內容相同,如下

6873 (a.out) R 6723 6873 6723 34819 6873 8388608 77 0 0 0 41958 31 0 0 25 0 3 0 5882654 1409024 56 4294967295 134512640 134513720 3215579040 0 2097798 0 0 0 0 0 0 0 17 0 0 0

各個字段的含義:

	pid=6873                  進程(包括輕量級進程,即線程)號comm=a.out                應用程序或命令的名字task_state=R              任務的狀態,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:deadppid=6723                 父進程IDpgid=6873                 線程組號sid=6723                  c該任務所在的會話組IDtty_nr=34819(pts/3)       該任務的tty終端的設備號,INT(34817/256=主設備號,(34817-主設備號)=次設備號tty_pgrp=6873             終端的進程組號,當前運行在該任務所在終端的前臺任務(包括shell 應用程序)的PID。task->flags=8388608       進程標志位,查看該任務的特性min_flt=77                該任務不需要從硬盤拷數據而發生的缺頁(次缺頁)的次數cmin_flt=0                累計的該任務的所有的waited-for進程曾經發生的次缺頁的次數目maj_flt=0                 該任務需要從硬盤拷數據而發生的缺頁(主缺頁)的次數cmaj_flt=0                累計的該任務的所有的waited-for進程曾經發生的主缺頁的次數目utime=1587                該任務在用戶態運行的時間,單位為jiffiesstime=1                   該任務在核心態運行的時間,單位為jiffiescutime=0                  累計的該任務的所有的waited-for進程曾經在用戶態運行的時間,單位為jiffiescstime=0                  累計的該任務的所有的waited-for進程曾經在核心態運行的時間,單位為jiffiespriority=25               任務的動態優先級nice=0                    任務的靜態優先級num_threads=3             該任務所在的線程組里線程的個數it_real_value=0           由于計時間隔導致的下一個 SIGALRM 發送進程的時延,以 jiffy 為單位.start_time=5882654        該任務啟動的時間,單位為jiffiesvsize=1409024           (page)該任務的虛擬地址空間大小rss=56(page)             該任務當前駐留物理地址空間的大小rlim=4294967295(bytes)  該任務能駐留物理地址空間的最大值start_code=134512640     該任務在虛擬地址空間的代碼段的起始地址end_code=134513720       該任務在虛擬地址空間的代碼段的結束地址start_stack=3215579040   該任務在虛擬地址空間的棧的結束地址kstkesp=0                esp(32 位堆棧指針) 的當前值, 與在進程的內核堆棧頁得到的一致.kstkeip=2097798          指向將要執行的指令的指針, EIP(32 位指令指針)的當前值.pendingsig=0             待處理信號的位圖,記錄發送給進程的普通信號block_sig=0              阻塞信號的位圖sigign=0                 忽略的信號的位圖sigcatch=082985          被俘獲的信號的位圖wchan=0                  如果該進程是睡眠狀態,該值給出調度的調用點nswap                    被swapped的頁數,當前沒用cnswap                   所有子進程被swapped的頁數的和,當前沒用exit_signal=17           該進程結束時,向父進程所發送的信號task_cpu(task)=0         運行在哪個CPU上task_rt_priority=0       實時進程的相對優先級別task_policy=0            進程的調度策略,0=非實時進程,1=FIFO實時進程;2=RR實時進程

進程的總Cpu時間processCpuTime = utime + stime + cutime + cstime
線程的總Cpu時間threadCpuTime = utime + stime + cutime + cstime

兩次采集時間片的數據獲取進程CPU占用率
CPU占用率 = (進程T2-進程T1)/(系統T2-系統T1) 的時間片比值

注:7.0以上的Android系統,/proc/stat無權限獲取。



四、流量

流量 :表示當前進程網絡的使用情況。

有兩種方法:

  • 通過Android提供的TrafficStats類來獲取;
  • 通過獲取proc文件內容來計算。

先看一下GT3.1采用的第一種方法:

TrafficStats源碼查看TrafficStats類是由Android提供的一個從你的手機開機開始,累計到現在使用的流量總量,或者統計某個或多個進程或應用所使用的流量,當然這個流量包括的Wifi和移動數據網Gprs。

	//系統流量統計:TrafficStats.getTotalRxBytes() ——獲取從此次開機起總接受流量(流量是分為上傳與下載兩類的);TrafficStats.getTotalTxBytes()——獲取從此次開機起總發送流量;TrafficStats.getMobileRxBytes()——獲取從此次開機起不包括Wifi的接受流量,即只統計數據網Gprs接受的流量;TrafficStats.getMobileTxBytes()——獲取從此次開機起不包括Wifi的發送流量,即只統計數據網Gprs發送的流量;//進程流量統計:TrafficStats.getUidRxBytes(mUid)TrafficStats.getUidTxBytes(mUid)  

獲取進程流量的方法:

u0_a開頭的都是Android的應用進程,Android的應用的UID是從10000開始,到19999結束。

	//獲取流量數據,上行和下行//這里mUid是應用的uid,非進程id pid,注意區分//uid獲取可根據包名得到,方法如下:public static int getUidByPkgName(String pkgname)  {PackageManager pm = getPackageManager();try {ApplicationInfo ai = pm.getApplicationInfo(pkgname, 0);Log.i(TAG,String.valueOf(ai.uid));return ai.uid;} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();return 0;}}public  static TrafficInfo collect(int mUid) {long upload  = TrafficStats.getUidRxBytes(mUid);long download = TrafficStats.getUidTxBytes(mUid);}

GT3.1開源獲取流量數據代碼:

https://github.com/Tencent/GT/blob/ed3a289a897d0ea14676a7c7d92344f5b398991e/android/GT_APP/app/src/main/java/com/tencent/wstt/gt/api/utils/NetUtils.java

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

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

相關文章

物理 常見力與牛頓三定律

常用知識點 動量 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安裝后會自帶一些小工具,jmap命令…

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

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

概率論 一維隨機變量

隨機變量 離散型隨機變量:有限個或無限可列個 連續型隨機變量 分布函數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:密鑰文件格式完全解析ECC數據結構

JAVA牛客專項練習2020.12.31

1.使用迭代器的remove方法,可以邊遍歷邊刪除元素 2.線程 啟動線程 new thread().start() new thread(new runnable()).start() 普通方法&#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…

WebLogic域的創建與發布

目錄一、前言二、準備三、創建域步驟第一步&#xff1a;直接【回車】第二步&#xff1a;直接【回車】第三步&#xff1a;直接【回車】第四步&#xff1a;輸入域名稱后【回車】第五步&#xff1a;直接【回車】第六步&#xff1a;直接【回車】&#xff08;此步驟是提示域的存放目…

安卓安卓移動操作系統優缺點

安卓移動操作系統優缺點 開發性 豐富的硬件 方便開發 gogle應用 安卓模擬器 手機,手表,電視,車載,安卓cel LogCat的使用–5級(日志) Log.v()–verbose全部信息,黑色 Log.d()–debug調試信息,藍色 Log.i()–info一般信息,綠色 Log.w()–warning警告信息,橙色 Log.e()–erro…

WebLogic啟動失敗:java.lang.AssertionError: Could not obtain the localhost address.

目錄一、錯誤信息二、解決方案第一步&#xff1a;查看本機計算機名稱第二步&#xff1a;編輯hosts文件一、錯誤信息 linux下啟動WebLogic報如下錯誤&#xff1a; 二、解決方案 此錯誤多半是hosts文件不對導致的。 解決步驟如下&#xff1a; 第一步&#xff1a;查看本機計…