查看内存信息:
一般来说内存占用大小有如下规律:
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 存了什么?
管理java heap的状态数据(用于GC);
JNI调用,也就是Native Stack;
JIT(即使编译器)编译时使用Native Memory,并且JIT的输入(Java字节码)和输出(可执行代码)也都是保存在Native Memory;
NIO direct buffer。对于IBM JVM和Hotspot,都可以通过-XX:MaxDirectMemorySize来设置nio直接缓冲区的最大值。默认是64M。超过这个时,会按照32M自动增大。
对于IBM的JVM某些版本实现,类加载器和类信息都是保存在Native Memory中的。
其他类型 描述
cursor cursor消耗的内存
ashmen 匿名共享内存,用来提供共享内存
other Dev 内部driver占用的内存
.so mmap c 库代码占用的内存
.jar mmap java文件代码占用的内存
.apk mmap apk代码占用的内存
.ttf mmap ttf文件代码占用的内存
.dex mmap dex文件代码占用的内存
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 -h
Usage: 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 进程id
PR 优先级
CPU% 当前瞬时CPU占用率
S 进程状态:D=不可中断的睡眠状态, R=运行, S=睡眠, T=跟踪/停止, Z=僵尸进程
#THR 程序当前所用的线程数
VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PCY 调度策略优先级,SP_BACKGROUND/SP_FOREGROUND
UID 进程所有者的用户id
Name 进程的名称
但是细心的同学会发现,两种测试CPU的方法的结果并不一致,且相差很多,那是什么原因呢?
参考:http://blog.csdn.net/oujunli/article/details/51463707