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.mzph.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;查看本机计…