adb 测试手机内存 cpu 以及几种方式对比

来源:互联网 发布:淘宝手游充值代理 编辑:程序博客网 时间:2024/04/29 23:47

查看内存信息:

一般来说内存占用大小有如下规律:

VSS >= RSS >= PSS >= USS

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)是单个进程全部可访问的地址空间

RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)是单个进程实际占用的内存大小,对于单个共享库, 尽管无论多少个进程使用,实际该共享库只会被装入内存一次。

PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)USS 是一个非常非常有用的数字, 因为它揭示了运行一个特定进程的真实的内存增量大小。如果进程被终止, USS 就是实际被返还给系统的内存大小。

USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。怀疑某个程序有内存泄露可以查看这个值是否一直有增加

VSS和RSS对查看某一进程自身的内存状况没什么作用,因为他们包含了共享库的内存使用,而往往共享库的资源占用比重是很大的,这样就稀释了对Process自身创建内存波动。

     我们一般观察Uss来反映一个进程的内存使用情况,Uss 的大小代表了只属于本进程正在使用的内存大小,这些内存在此进程被杀掉之后,会被完整的回收掉。

     USS是一个非常有用的数字,因为它揭示了运行一个特定进程的真实的内存增量大小,如果进程被终止,USS就是实际被返还给系统的内存大小。USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。

   怀疑某个程序有内存泄露可以查看USS值是否一直有增加。


测试单个APP可使用如下命令: adb shell dumpsys meminfo com.sohu.sohuvideo 

截图如下:



其中native heap是指c/c++申请的内存空间,而dalvik heap 是指java申请的内存空间,heap alloc是指分配的空间,heap free是指剩余空间,heap size是指最大的分配空间,heap size = heap alloc + heap free;

这里讲了native和dalvik的详细内容:http://blog.csdn.net/u013721793/article/details/51204001

JVM管理的内存可以总体划分为两部分:Heap Memory和Native Memory。前者我们比较熟悉,是供Java应用程序使用的;后者也称为C-Heap,是供JVM自身进程使用的。Heap Memory及其内部各组成的大小可以通过JVM的一系列命令行参数来控制,在此不赘述。Native Memory没有相应的参数来控制大小,其大小依赖于操作系统进程的最大值(对于32位系统就是3~4G,各种系统的实现并不一样),以及生成的Java字节码大小、创建的线程数量、维持java对象的状态信息大小(用于GC)以及一些第三方的包,比如JDBC驱动使用的native内存。

Native Memory 存了什么?

  1. 管理java heap的状态数据(用于GC);
  2. JNI调用,也就是Native Stack;
  3. JIT(即使编译器)编译时使用Native Memory,并且JIT的输入(Java字节码)和输出(可执行代码)也都是保存在Native Memory;
  4. NIO direct buffer。对于IBM JVM和Hotspot,都可以通过-XX:MaxDirectMemorySize来设置nio直接缓冲区的最大值。默认是64M。超过这个时,会按照32M自动增大。
  5. 对于IBM的JVM某些版本实现,类加载器和类信息都是保存在Native Memory中的。

其他类型描述cursorcursor消耗的内存ashmen匿名共享内存,用来提供共享内存other Dev内部driver占用的内存.so mmapc 库代码占用的内存.jar mmapjava文件代码占用的内存.apk mmapapk代码占用的内存.ttf mmapttf文件代码占用的内存.dex mmapdex文件代码占用的内存other mmap其他文件占用的内存
曾经一直用total数据做参考,但是测出来的数据,APP开发不认,说太大,他们用的是dalvik heap size 这个数据,然后我就不知道用什么数据测内存了,目前保留两种方式


查看CPU信息:

单个APP: adb shell dumpsys cpuinfo |findstr com.sohu.sohuvideo

整体手机: adb shell dumpsys cpuinfo | findstr TOTAL

adb shell top:

adb shell top 方法也同样可以对内存和CPU进行测试

top 用法

>adb shell top -hUsage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [-t ] [ -h ]    -m num  Maximum number of processes to display. 最多显示多少个进程    -n num  Updates to show before exiting.  刷新次数     -d num  Seconds to wait between updates. 刷新间隔时间(默认5秒)    -s col  Column to sort by (cpu,vss,rss,thr). 按哪列排序     -t      Show threads instead of processes. 显示线程信息而不是进程    -h      Display this help screen.  显示帮助文档 

正常使用adb shell top 会一直不断刷新,根据top用法可设置单次情况,如:adb shell top -m 10 -s cpu -n 1


第一组数据的含义:

User  处于用户态的运行时间,不包含优先值为负进程 Nice  优先值为负的进程所占用的CPU时间 Sys   处于核心态的运行时间 Idle  除IO等待时间以外的其它等待时间 IOW   IO等待时间 IRQ   硬中断时间 SIRQ  软中断时间 

第二组数据的含义:

PID   进程idPR    优先级CPU%  当前瞬时CPU占用率S     进程状态:D=不可中断的睡眠状态, R=运行, S=睡眠, T=跟踪/停止, Z=僵尸进程#THR  程序当前所用的线程数VSS   Virtual Set Size  虚拟耗用内存(包含共享库占用的内存)RSS   Resident Set Size 实际使用物理内存(包含共享库占用的内存)PCY   调度策略优先级,SP_BACKGROUND/SP_FOREGROUNDUID   进程所有者的用户idName  进程的名称

但是细心的同学会发现,两种测试CPU的方法的结果并不一致,且相差很多,那是什么原因呢?

http://blog.csdn.net/oujunli/article/details/51463707

这篇博客写的比较详细,计算方法不一致而已!


原创粉丝点击