Android 基础性能数据获取(/proc/)
一、系統(tǒng)內(nèi)存
讀取命令:
/proc/meminfoJava代碼:
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());}}輸出結(jié)果:
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的總和,被系統(tǒng)留著未使用的內(nèi)存。Buffers: 用來給文件做緩沖大小。Cached: 被高速緩沖存儲(chǔ)器(cache memory)用的內(nèi)存的大小(等于diskcache minus SwapCache)。SwapCached: 被高速緩沖存儲(chǔ)器(cache memory)用的交換空間的大小。已經(jīng)被交換出來的內(nèi)存,仍然被存放在swapfile中,用來在需要的時(shí)候很快的被替換而不需要再次打開I/O端口。Active: 在活躍使用中的緩沖或高速緩沖存儲(chǔ)器頁面文件的大小,除非非常必要,否則不會(huì)被移作他用。Inactive: 在不經(jīng)常使用中的緩沖或高速緩沖存儲(chǔ)器頁面文件的大小,可能被用于其他途徑。SwapTotal: 交換空間的總大小。SwapFree: 未被使用交換空間的大小。Dirty: 等待被寫回到磁盤的內(nèi)存大小。Writeback: 正在被寫回到磁盤的內(nèi)存大小。AnonPages: 未映射頁的內(nèi)存大小。Mapped: 設(shè)備和文件等映射的大小。Slab: 內(nèi)核數(shù)據(jù)結(jié)構(gòu)緩存的大小,可以減少申請和釋放內(nèi)存帶來的消耗。SReclaimable: 可收回Slab的大小。SUnreclaim: 不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。PageTables: 管理內(nèi)存分頁頁面的索引表的大小。NFS_Unstable: 不穩(wěn)定頁表的大小。系統(tǒng)內(nèi)存總?cè)萘?#xff1a; 只需要讀取“/proc/meminfo”文件的第一個(gè)字段“MemTotal”就可以了。
系統(tǒng)空閑的內(nèi)存: 只需要通過ActivityManager即可獲取。
//系統(tǒng)空閑內(nèi)存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;}二、進(jìn)程內(nèi)存
進(jìn)程內(nèi)存上限:
//進(jìn)程內(nèi)存上限public static int getMemoryMax() {return (int) (Runtime.getRuntime().maxMemory()/1024);}進(jìn)程總內(nèi)存:
//進(jìn)程總內(nèi)存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開源獲取內(nèi)存數(shù)據(jù)代碼:
https://github.com/Tencent/GT/blob/ed3a289a897d0ea14676a7c7d92344f5b398991e/android/GT_APP/app/src/main/java/com/tencent/wstt/gt/api/utils/MemUtils.java
三、CPU篇
CPU :表示進(jìn)程或線程的繁忙程度
獲取CPU主要用兩種方法:
- 一種是利用top命令或者dumpsys cpuinfo,
- 第二種是讀取/proc/stat文件,然后解析相關(guān)參數(shù),自己去計(jì)算。
下面主要介紹第二種方法,也是個(gè)人比較推薦的方法
/proc文件系統(tǒng)是一個(gè)偽文件系統(tǒng),它只存在內(nèi)存當(dāng)中,而不占用外存空間。它以文件系統(tǒng)的方式為內(nèi)核與進(jìn)程提供通信的接口。用戶和應(yīng)用程序可以通過/proc得到系統(tǒng)的信息,并可以改變內(nèi)核的某些參數(shù)。由于系統(tǒng)的信息,如進(jìn)程,是動(dòng)態(tài)改變的,所以用戶或應(yīng)用程序讀取/proc目錄中的文件時(shí),proc文件系統(tǒng)是動(dòng)態(tài)從系統(tǒng)內(nèi)核讀出所需信息并提交的。 從proc文件中可以獲取系統(tǒng)、進(jìn)程、線程的cpu時(shí)間片使用情況,所以兩次采集時(shí)間片的數(shù)據(jù)就可以獲取進(jìn)程CPU占用率, CPU占用率 = (進(jìn)程T2-進(jìn)程T1)/(系統(tǒng)T2-系統(tǒng)T1) 的時(shí)間片比值。
1、獲取系統(tǒng)CPU時(shí)間片
獲取系統(tǒng)CPU時(shí)間片使用情況:讀取proc/stat,文件的內(nèi)容如下:
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第一行各個(gè)字段的含義:
user (14624) 從系統(tǒng)啟動(dòng)開始累計(jì)到當(dāng)前時(shí)刻,處于用戶態(tài)的運(yùn)行時(shí)間,不包含 nice值為負(fù)進(jìn)程。 nice (771) 從系統(tǒng)啟動(dòng)開始累計(jì)到當(dāng)前時(shí)刻,nice值為負(fù)的進(jìn)程所占用的CPU時(shí)間 system (8484) 從系統(tǒng)啟動(dòng)開始累計(jì)到當(dāng)前時(shí)刻,處于核心態(tài)的運(yùn)行時(shí)間 idle (283052) 從系統(tǒng)啟動(dòng)開始累計(jì)到當(dāng)前時(shí)刻,除IO等待時(shí)間以外的其它等待時(shí)間 iowait (0) 從系統(tǒng)啟動(dòng)開始累計(jì)到當(dāng)前時(shí)刻,IO等待時(shí)間(since 2.5.41) irq (0) 從系統(tǒng)啟動(dòng)開始累計(jì)到當(dāng)前時(shí)刻,硬中斷時(shí)間(since 2.6.0-test4) softirq (62) 從系統(tǒng)啟動(dòng)開始累計(jì)到當(dāng)前時(shí)刻,軟中斷時(shí)間(since 2.6.0-test4)總的cpu時(shí)間totalCpuTime = user + nice + system + idle + iowait + irq + softirq
2、獲取進(jìn)程和線程的CPU時(shí)間片
獲取進(jìn)程CPU時(shí)間片使用情況:讀取proc/pid/stat,獲取線程CPU時(shí)間片使用情況:讀取proc/pid/task/tid/stat,這兩個(gè)文件的內(nèi)容相同,如下
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各個(gè)字段的含義:
pid=6873 進(jìn)程(包括輕量級(jí)進(jìn)程,即線程)號(hào)comm=a.out 應(yīng)用程序或命令的名字task_state=R 任務(wù)的狀態(tài),R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:deadppid=6723 父進(jìn)程IDpgid=6873 線程組號(hào)sid=6723 c該任務(wù)所在的會(huì)話組IDtty_nr=34819(pts/3) 該任務(wù)的tty終端的設(shè)備號(hào),INT(34817/256)=主設(shè)備號(hào),(34817-主設(shè)備號(hào))=次設(shè)備號(hào)tty_pgrp=6873 終端的進(jìn)程組號(hào),當(dāng)前運(yùn)行在該任務(wù)所在終端的前臺(tái)任務(wù)(包括shell 應(yīng)用程序)的PID。task->flags=8388608 進(jìn)程標(biāo)志位,查看該任務(wù)的特性min_flt=77 該任務(wù)不需要從硬盤拷數(shù)據(jù)而發(fā)生的缺頁(次缺頁)的次數(shù)cmin_flt=0 累計(jì)的該任務(wù)的所有的waited-for進(jìn)程曾經(jīng)發(fā)生的次缺頁的次數(shù)目maj_flt=0 該任務(wù)需要從硬盤拷數(shù)據(jù)而發(fā)生的缺頁(主缺頁)的次數(shù)cmaj_flt=0 累計(jì)的該任務(wù)的所有的waited-for進(jìn)程曾經(jīng)發(fā)生的主缺頁的次數(shù)目utime=1587 該任務(wù)在用戶態(tài)運(yùn)行的時(shí)間,單位為jiffiesstime=1 該任務(wù)在核心態(tài)運(yùn)行的時(shí)間,單位為jiffiescutime=0 累計(jì)的該任務(wù)的所有的waited-for進(jìn)程曾經(jīng)在用戶態(tài)運(yùn)行的時(shí)間,單位為jiffiescstime=0 累計(jì)的該任務(wù)的所有的waited-for進(jìn)程曾經(jīng)在核心態(tài)運(yùn)行的時(shí)間,單位為jiffiespriority=25 任務(wù)的動(dòng)態(tài)優(yōu)先級(jí)nice=0 任務(wù)的靜態(tài)優(yōu)先級(jí)num_threads=3 該任務(wù)所在的線程組里線程的個(gè)數(shù)it_real_value=0 由于計(jì)時(shí)間隔導(dǎo)致的下一個(gè) SIGALRM 發(fā)送進(jìn)程的時(shí)延,以 jiffy 為單位.start_time=5882654 該任務(wù)啟動(dòng)的時(shí)間,單位為jiffiesvsize=1409024 (page)該任務(wù)的虛擬地址空間大小rss=56(page) 該任務(wù)當(dāng)前駐留物理地址空間的大小rlim=4294967295(bytes) 該任務(wù)能駐留物理地址空間的最大值start_code=134512640 該任務(wù)在虛擬地址空間的代碼段的起始地址end_code=134513720 該任務(wù)在虛擬地址空間的代碼段的結(jié)束地址start_stack=3215579040 該任務(wù)在虛擬地址空間的棧的結(jié)束地址kstkesp=0 esp(32 位堆棧指針) 的當(dāng)前值, 與在進(jìn)程的內(nèi)核堆棧頁得到的一致.kstkeip=2097798 指向?qū)⒁獔?zhí)行的指令的指針, EIP(32 位指令指針)的當(dāng)前值.pendingsig=0 待處理信號(hào)的位圖,記錄發(fā)送給進(jìn)程的普通信號(hào)block_sig=0 阻塞信號(hào)的位圖sigign=0 忽略的信號(hào)的位圖sigcatch=082985 被俘獲的信號(hào)的位圖wchan=0 如果該進(jìn)程是睡眠狀態(tài),該值給出調(diào)度的調(diào)用點(diǎn)nswap 被swapped的頁數(shù),當(dāng)前沒用cnswap 所有子進(jìn)程被swapped的頁數(shù)的和,當(dāng)前沒用exit_signal=17 該進(jìn)程結(jié)束時(shí),向父進(jìn)程所發(fā)送的信號(hào)task_cpu(task)=0 運(yùn)行在哪個(gè)CPU上task_rt_priority=0 實(shí)時(shí)進(jìn)程的相對優(yōu)先級(jí)別task_policy=0 進(jìn)程的調(diào)度策略,0=非實(shí)時(shí)進(jìn)程,1=FIFO實(shí)時(shí)進(jìn)程;2=RR實(shí)時(shí)進(jìn)程進(jìn)程的總Cpu時(shí)間processCpuTime = utime + stime + cutime + cstime
線程的總Cpu時(shí)間threadCpuTime = utime + stime + cutime + cstime
兩次采集時(shí)間片的數(shù)據(jù)獲取進(jìn)程CPU占用率
CPU占用率 = (進(jìn)程T2-進(jìn)程T1)/(系統(tǒng)T2-系統(tǒng)T1) 的時(shí)間片比值
注:7.0以上的Android系統(tǒng),/proc/stat無權(quán)限獲取。
四、流量
流量 :表示當(dāng)前進(jìn)程網(wǎng)絡(luò)的使用情況。
有兩種方法:
- 通過Android提供的TrafficStats類來獲取;
- 通過獲取proc文件內(nèi)容來計(jì)算。
先看一下GT3.1采用的第一種方法:
TrafficStats源碼查看TrafficStats類是由Android提供的一個(gè)從你的手機(jī)開機(jī)開始,累計(jì)到現(xiàn)在使用的流量總量,或者統(tǒng)計(jì)某個(gè)或多個(gè)進(jìn)程或應(yīng)用所使用的流量,當(dāng)然這個(gè)流量包括的Wifi和移動(dòng)數(shù)據(jù)網(wǎng)Gprs。
//系統(tǒng)流量統(tǒng)計(jì):TrafficStats.getTotalRxBytes() ——獲取從此次開機(jī)起總接受流量(流量是分為上傳與下載兩類的);TrafficStats.getTotalTxBytes()——獲取從此次開機(jī)起總發(fā)送流量;TrafficStats.getMobileRxBytes()——獲取從此次開機(jī)起不包括Wifi的接受流量,即只統(tǒng)計(jì)數(shù)據(jù)網(wǎng)Gprs接受的流量;TrafficStats.getMobileTxBytes()——獲取從此次開機(jī)起不包括Wifi的發(fā)送流量,即只統(tǒng)計(jì)數(shù)據(jù)網(wǎng)Gprs發(fā)送的流量;//進(jìn)程流量統(tǒng)計(jì):TrafficStats.getUidRxBytes(mUid)TrafficStats.getUidTxBytes(mUid)獲取進(jìn)程流量的方法:
u0_a開頭的都是Android的應(yīng)用進(jìn)程,Android的應(yīng)用的UID是從10000開始,到19999結(jié)束。
//獲取流量數(shù)據(jù),上行和下行//這里mUid是應(yīng)用的uid,非進(jìn)程id pid,注意區(qū)分//uid獲取可根據(jù)包名得到,方法如下: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開源獲取流量數(shù)據(jù)代碼:
https://github.com/Tencent/GT/blob/ed3a289a897d0ea14676a7c7d92344f5b398991e/android/GT_APP/app/src/main/java/com/tencent/wstt/gt/api/utils/NetUtils.java
總結(jié)
以上是生活随笔為你收集整理的Android 基础性能数据获取(/proc/)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网钢铁概念股票龙头一览表,2022互
- 下一篇: Android设计模式之——命令模式