adb命令 -- 性能相关

adb命令 – 性能相关

内存

查看内存信息

adb shell dumpsys meminfo  #获取pid
adb shell dumpsys meminfo pid

dumpsys meminfo:观察整体内存
smaps:观察整体内存的详细组成

** MEMINFO in pid 28803 [com.tencent.mobileqq] **
                   Pss  Private  Private  SwapPss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap     6750     6748        0    52528    90112    71888    18223
  Dalvik Heap    27231    27220        0      864    36380    28188     8192
 Dalvik Other     2148     2148        0     3628
        Stack       20       20        0       24
       Ashmem        0        0        0        0
    Other dev       36        0       36        0
     .so mmap     2555       72     1952     2643
    .jar mmap      382        0        0        0
    .apk mmap      377        0       64        0
    .ttf mmap        0        0        0        0
    .dex mmap    31717       16    23524     3592
    .oat mmap      211        0        0        0
    .art mmap    18264    18040       20    18624
   Other mmap      633      308      244        0
    GL mtrack      840      840        0        0
      Unknown     1448     1448        0     5102
        TOTAL   179617    56860    25840    87005   126492   100076    26415

 App Summary
                       Pss(KB)
                        ------
           Java Heap:    45280
         Native Heap:     6748
                Code:    25628
               Stack:       20
            Graphics:      840
       Private Other:     4184
              System:    96917

               TOTAL:   179617       TOTAL SWAP PSS:    87005

私有内存(Dirty and Clean):
进程独占内存。也就是进程销毁时可以回收的内存容量。通常private Dirty内存是最重要的部分,因为只被自己进程使用。Dirty内存是已经被修改的内存页,因此必须常驻内存(因为没有swap);Clean内存是已经映射持久文件使用的内存页(例如正在被执行的代码),因此一段时间不使用的话就可以置换出去。

Pss是指实际使用的物理内存,考虑了在进程之间共享RAM页的情况。进程独占的RAM页会直接计入其PSS值,而与其他进程共享的RAM页则会按相应比例计入PSS值。例如,两个进程之间共享的 RAM 页会将其一半的大小分别计入这两个进程的 PSS 中。

可通过procrank命令查看

Item全称内存形式统计范围描述
USSUnique Set Size物理内存进程独占的内存单个进程的全部私有内存大小,亦即全部被该进程独占的内存大小
PSSProportional Set Size物理内存Pss =Uss+按比例包含共享库描述系统内存整体使用
RSSResient Set Size物理内存RSS=USS+包含共享库指单个进程实际占用的内存大小,不是精确描述
VSSVirtual Set Size虚拟耗用内存VSS = RSS+未分配实际物理内存(包含共享库占用的内存)是单个进程全部可访问的地址空间

内存的大小关系:VSS>RSS>=PSS>=USS
在实际分析中,一般是以PSS的内存为准,且也是最符合实际情况的统计值
通常我们需要关注PSS TOTAL 和 Private Dirty

匿名共享内存(Anonymous Shared Memory-Ashmem。Android匿名共享内存是基于Linux共享内存的,都是在tmpfs文件系统上新建文件,并将其映射到不同的进程空间,从而达到共享内存的目的,只是,Android在Linux的基础上进行了改造,并借助Binder+fd文件描述符实现了共享内存的传递。

参数分析:
纵轴

参数含义
Native HeapNative代码分配的内存,虚拟机和Android框架分配内存,如C\C++堆的内存。
Dalvik HeapJava对象分配的占据内存,包括它自身的开销;Dalvik堆中和zygote进程共享的部分算是sharedDirty。
Dalvik Other类数据结构和索引占据内存
Stack堆内存
Ashmem匿名共享内存,此类内存与cache shrinker关联,可以控制cache shrinker在适当时机回收这些共享内存。通过分配一个多个进程可以共享的带名称的内存块实现内存共享。
Other dev内部driver占用的内存
.so mmap映射的.so(native) 占用的内存,通常为C、C++库代码
.jar mmapjava文件代码占用的内存
.apk mmapapk代码占用的内存
.ttf mmapttf文件代码占用的内存
.dex mmap映射的.dex(Dalvik 或ART)代码占用的内存。类函数的代码和常量占用的内存,dex mmap是映射classex.dex文件,Dalvik虚拟机从dex文件加载类信息和字符串常量等。Dex文件有索引区和Data区
oat mmap代码映射占用的内存。此映像在所有应用之间共享,不受特定应用影响
.art mmap堆映像占用的内存,此映像在所有应用之间共享,不受特定应用影响。尽管ART映射包含Object实例,它仍然不会计入堆的大小
Other mmap其它文件占用的内存
unknow系统无法将其分类到其他更具体的一个项中的任何 RAM 页
total进程占用的按比例分摊的内存大小 (PSS) RAM 总容量,等于上述所有 PSS 字段的总和
Pss进程各部分内存的消耗,是所有进程pss相加得到系统占用内存的总和。

横轴

参数含义
Pss Total某一项Pss的总值。
Private Dirty私有驻留内存。是仅分配给应用堆的实际RAM,包含了自己的分配和zygote分配页,这些分配页自从zygote派生应用进程以来已被修改。即使你的进程已经退出,该内存也不会被释放
Private Clean进程私有的,相对磁盘数据没有使用修改的内存。
SwapPss Dirty一些Android设备确实使用了内存交换,但它们使用的是内存而不是闪存。Linux有一个称为ZRAM的特性,它可以压缩页面,然后将它们交换到一个特殊的RAM区域,并在需要时再次解压它们。因此,“交换肮脏”中列出的页面很可能是在ZRAM中。
Heap SizeDalvik Heap总共的内存大小
Heap Alloc所有应用实例分配的内存,包括了应用从zygote分享的内存
Heap Free空闲内存

查看单个应用最大内存限制

getprop | grep heapgrowthlimit

在这里插入图片描述

CPU

实时显示流程活动。

 top [-Hbq] [-k FIELD,] [-o FIELD,] [-s SORT] [-n NUMBER] [-m LINES] [-d SECONDS] [-p PID,] [-u USER,]

参数:

参数–help描述
-HShow threads显示线程
-kFallback sort FIELDS (default -S,-%CPU,-ETIME,-PID)回退排序字段(默认为- s,-%CPU,- etime,- pid)
-oShow FIELDS (def PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,CMDLINE)显示字段
-OAdd FIELDS (replacing PR,NI,VIRT,RES,SHR,S from default)添加字段
-sSort by field number (1-X, default 9)按字段编号排序(1-X,默认为9)
-bBatch mode (no tty)批处理模式(无tty)
-dDelay SECONDS between each cycle (default 3)刷新时间间隔(默认3)
-mMaximum number of tasks to show要显示的最大任务数
-nExit after NUMBER iterations刷新次数
-pShow these PIDs显示pid
-uShow these USERs显示用户
adb shell top -m 10
Tasks: 670 total,   1 running, 664 sleeping,   2 stopped,   3 zombie
  Mem:      7.3G total,      6.8G used,      484M free,      6.8M buffers
 Swap:      4.0G total,      2.1G used,      1.8G free,      3.0G cached
800%cpu  15%user   0%nice  12%sys 773%idle   0%iow   0%irq   0%sirq   0%host
  PID USER         PR  NI VIRT  RES  SHR S[%CPU] %MEM     TIME+ ARGS
11386 u999_a208    20   0 7.2G 101M  66M S  9.6   1.3  12:47.68 com.tencent.mm:+
 1441 system       18  -2  11G 315M 182M S  7.3   4.1 527:28.46 system_server
11255 shell        20   0  29M 4.7M 3.4M R  2.3   0.0   0:01.83 top -m 10
  293 root         RT   0    0    0    0 S  2.0   0.0  25:35.49 [irq/36-5-0034]
 3591 u0_a208      20   0 7.5G 343M 278M S  1.3   4.5   0:56.73 com.tencent.mm
  302 root         20   0    0    0    0 D  1.3   0.0  12:23.64 [psl_thd]
10047 root         20   0    0    0    0 I  0.3   0.0   0:00.41 [kworker/2:2]
 7969 root         20   0    0    0    0 I  0.3   0.0   0:03.60 [kworker/0:3]
 2548 root         20   0    0    0    0 I  0.3   0.0   0:01.93 [kworker/1:4]
31542 root         20   0    0    0    0 I  0.3   0.0   0:04.68 [kworker/u16:9]

CPU占用率:

User用户进程
Nice优先值为负的进程所占用的CPU时间
Sys系统进程
Idle除IO等待时间以外的其它等待时间
iowIO等待时间
irq硬中断时间
sirq软中断时间

进程属性:

PID进程id
USER进程所属用户
PR进程优先级
NInice值。负值表示高优先级,正值表示低优先级
VIRT进程使用的虚拟内存总量,单位kb
RES进程使用的、未被换出的物理内存大小,单位kb
SHR共享内存大小,单位kb
S进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU上次更新到现在的CPU时间占用百分比
%MEM进程使用的物理内存百分比
TIME+进程使用的CPU时间总计,单位1/100秒
ARGS变量名(进程名称/命令名/命令行)

VIRT虚拟内存

VIRT=SWAP+RES 
进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等;
假如进程新申请10MB的内存,但实际只使用了1MB,那么它会增长10MB,而不是实际的1MB使用量。
VIRT高是因为分配了太多地址空间导致。

RES实际占用内存

RES=CODE+DATA 
进程当前使用的内存大小,包括使用中的malloc、new分配的堆空间和分配的栈空间,但不包括swap out量;
包含其他进程的共享;
如果申请10MB的内存,实际使用1MB,它只增长1MB;

SHR:

除了自身进程的共享内存,也包括其他进程的共享内存;
虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小;
计算某个进程所占的物理内存大小公式:RES – SHR;
swap out后,它将会降下来。

进程

adb shell ps -P -p -t -x -c [pid] [name] [ | grep  ]

参数说明:
-P	显示调度策略,通常是bg或fg,当获取失败将会是un和er
-p	显示进程的优先级和nice等级
-t	显示进程下的线程列表
-x	显示进程耗费的用户时间和系统时间,格式(u:0, s:0,单位为:秒
-c	显示进程耗费的CPU时间(低于4.0版本可能不兼容)
[pid]	过滤指定的进程PID
[name]	过滤指定的进程NAME

S状态值

状态值说明
D不可中断的睡眠态
R运行态
S睡眠态
T被跟踪或已停止
Z僵尸态
W进入内存交换(从内核2.6开始无效)
X死掉的进程
<高优先级
N低优先级
L有些页被锁进内存
s包含子进程
l多线程,克隆线程
+位于后台的进程组
USER           PID  PPID     VSZ    RSS WCHAN            ADDR S NAME
root             1     0   84476   4496 0                   0 S init
root             2     0       0      0 0                   0 S [kthreadd]
root             4     2       0      0 0                   0 I [kworker/0:0H]
root             6     2       0      0 0                   0 I [mm_percpu_wq]
root             7     2       0      0 0                   0 S [ksoftirqd/0]
root             8     2       0      0 0                   0 I [rcu_preempt]

参数说明:

参数说明
USER进程当前所属的用户
PID进程ID
PPID父进程ID
VSZ进程的虚拟内存大小,以KB为单位
RSS进程实际占用的内存大小,以KB为单位
WCHAN进程正在睡眠的内核函数名称,该函数名称是从/root、system.map文件中读取的,0代表进程处于运行态;否则代表内核地址(休眠态)

参考meminfo&dumpsys meminfo PID 查看单进程内存信息详解&性能优化之借助adb shell ps /top 指令详细分析进程

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用adb命令可以测试安卓应用程序的性能。通过运行adb命令,可以获取应用程序的性能数据,并将其保存在csv文件中。这些性能数据包括均值、最大值和最小值等指标。可以使用adb命令来测试应用程序的启动时间、流量消耗和电量消耗等性能指标。 对于启动时间的测试,可以使用adb shell am start -W package命令来测试应用程序的热启动和冷启动时间。其中WaitTime参数表示启动的时间。 对于流量的测试,可以使用adb shell命令来查看应用程序的进程ID(pid)和用户ID(uid),然后使用cat /proc/uid_stat/uid/tcp_rcv(tcp_snd)命令来获取发送和接收的流量数据。测试前获取流量数值,测试后再次获取,两者的差值就是应用程序消耗的流量。 对于电量的测试,可以使用adb shell dumpsys batterystats > battery.txt命令来获取电量使用情况。在生成的battery.txt文件中,可以查找关键词"Estimated power use"下的具体uid的耗电情况。 总之,通过adb命令可以方便地测试安卓应用程序的性能,包括启动时间、流量消耗和电量消耗等指标。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [可测含多进程的app-- python调用adb命令获取Android App应用的性能数据:CPU、GPU、内存、电池、耗电量(含...](https://blog.csdn.net/u012089395/article/details/126668946)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [android开发获取应用本身耗电量_APP性能测试——Android](https://blog.csdn.net/weixin_39834780/article/details/110200499)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rpk712

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值