我的编程空间,编程开发者的网络收藏夹
学习永远不晚

统计 Android 应用的 CPU 和内存

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

统计 Android 应用的 CPU 和内存

Android 系统基于 Linux 的内核构建起来,因此统计应用消耗的内存和占用的 CPU 时非常方便,本文介绍统计 CPU 和内存的命令,以及实现自动化统计的思路

CPU 的统计

Linux 提供了非常简单的一个命令

top
,可以查看应用的 CPU 和内存占用情况,Android shell 下也可以直接使用它,输入如下命令就能够在窗口中循环输出 CPU 占用靠前的应用进程

$ adb shell top
400%cpu  67%user   7%nice  63%sys 251%idle   1%iow   9%irq   2%sirq   0%host
  PID USER         PR  NI VIRT  RES  SHR S[%CPU] %MEM     TIME+ ARGS
 2400 system       20   0 4.1G  64M  37M S 39.3   1.7   0:45.45 com.example+
 1050 system       18  -2 4.3G 138M  94M S 15.0   3.8   0:40.05 system_server
 3464 u0_a39       20   0 2.0G 238M  59M S 14.6   6.5   0:32.29 com.abc.test+

第 9 行 [%CPU] 和 第 10 行 %MEM 则分别对应进程的 CPU 占用率百分比和内存占用率百分比

这里 CPU 所在的列被中括号框选住,表示排序方式按 CPU 从高到低降序排列

另外,留意第一行第一列,显示的是 400%cpu,这是什么意思呢?

这表示 CPU 核心数不止一个,在这里有四个,所以就是 4 * 100%

想要查询这个命令传递参数的用法,可以输入

$ adb shell top --help
usage: top [-Hbq] [-k FIELD,] [-o FIELD,] [-s SORT] [-n NUMBER] [-d SECONDS] [-p PID,] [-u USER,]
Show process activity in real time.
-H	Show threads
-k	Fallback sort FIELDS (default -S,-%CPU,-ETIME,-PID)
-o	Show FIELDS (def PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,CMDLINE)
-O	Add FIELDS (replacing PR,NI,VIRT,RES,SHR,S from default)
-s	Sort by field number (1-X, default 9)
-b	Batch mode (no tty)
-d	Delay SECONDS between each cycle (default 3)
-n	Exit after NUMBER iterations
-p	Show these PIDs
-u	Show these USERs
-q	Quiet (no header lines)

这里面重点提示一下

-p
参数,表示只输出指定进程 ID,
-H
参数,表示输出线程的占用率

我们发现,这个命令只是把结果打印到窗口里,如果要保存到文件中做进一步分析,或者提供给开发排查问题,可以输入

$ adb shell top > file.txt

这样就保存到文件中了

另外,上面提到默认情况下是按 CPU 降序排列,使用

-s 列号
的参数可以按照其他列进行降序排列,比如按内存占用降序

$ adb shell top -s 10

Android 中,除了 top 命令外,还有一个命令用来统计最近一段时间内的 CPU 占用率,这在快速分析最近 CPU 占用时非常有用

$ adb shell dumpsys cpuinfo
Load: 7.88 / 8.13 / 5.81
CPU usage from 372745ms to 72694ms ago (2018-10-18 20:10:37.725 to 2018-10-18 20:15:37.776):
  39% 2400/com.xxx.xxx.xx: 29% user + 10% kernel / faults: 708419 minor
  15% 1050/system_server: 9.6% user + 5.5% kernel / faults: 29353 minor
  13% 1863/com.android.phone: 9.5% user + 4.1% kernel / faults: 113330 minor
  13% 3464/com.yy.yyy.yyyy: 8.5% user + 4.7% kernel / faults: 24530 minor

从输出内容中,可以读到,这是一段 20:10:37.725 到 20:15:37.776 这五分钟内的 CPU 占用率统计

这段时间里,占用最高的应用占比为 39%,它的包名是 com.xxx.xxx.xx

其中 29% 为用户态,10% 为内核态

CPU 占用率统计的原理是什么呢?我这里以 Android 8.1 系统来解读一下

每个应用启动以后,会随机分配到一个 ID 值,叫做

PID
,可以通过
ps
命令查询应用的包名时得到

$ adb shell ps |grep com.android.settings
system        4603   543 4378288  43428 0                   0 S com.android.settings

这里第二列的数字就是 PID,4603

应用启动以后,需要 CPU 做运算时,就会占用 CPU 的时间片让它去替自己做事,系统就会在某个位置写入应用的 CPU 占用时间,要查看这个时间,可以输入命令,以下命令中的 4603,需要替换为实际情况下的 PID 值

$ adb shell cat /proc/4603/stat
4603 (ndroid.settings) S 543 543 0 0 -1 1077936448 8978 0 13 0 4 6 0 0 20 0 11 0 5699 4483366912 10857 18446744073709551615 1 1 0 0 0 0 4612 0 1073775864 0 0 0 17 3 0 0 0 0 0 0 0 0 0 0 0 0 0

其中第 14 和 15 列的数字,分表表示应用在用户态下的 CPU 时间以及在内核态下的 CPU 时间

依据是 LInux 系统 proc 描述

http://man7.org/linux/man-pages/man5/proc.5.html

这两个数求和便是应用从启动到现在,一共使用的 CPU 时间

想要求得某个时间段中 CPU 的占用时间,则在 T1 时间,抓一次此数值,经过一段时间后,在 T2 时间,再抓一次此数值,求 T2 和 T1 数值之差便得到该时间段内的占用时间

既然我们是计算应用的 CPU 占用率,那么从哪里获得系统的占用时间呢?答案如下

$ adb shell cat /proc/stat
cpu  227074 29957 236622 747320 1822 34855 6375 0 0 0
cpu0 67340 7410 77242 142887 526 21616 4121 0 0 0
cpu1 64458 8939 77368 157790 717 9491 1260 0 0 0
cpu2 53326 7030 40617 216464 321 2078 615 0 0 0
cpu3 41950 6578 41395 230179 258 1670 379 0 0 0
...

对于每个数字的含义,仍然可参考上述页面下 Linux 对 proc 的解释

这里将输出结果第一行 cpu 字段后面的数字求和,即得到当前时间系统 CPU 的占用时间

分别抓取 T1 时刻和 T2 时刻系统 CPU 的占用时间,求差数就得到这个时间段内整个系统对 CPU 的占用

那么我们就可以算出来应用在 T1 和 T2 时间段内的 CPU 占用率了

内存的统计

内存的统计原理相比于 CPU 更加复杂,这里不展开来谈,我们先学习统计的方法

Android 中推荐使用

dumpsys
命令去统计内存,而不是使用 top,因为它们计算方式上略有差别,我们依据 Android 官方推荐为准,使用如下命令

$ adb shell dumpsys meminfo

从这个命令中,我们能提取到总的物理内存值

Total RAM: 3,706,588K (status normal)

如果启动的应用非常多,那么此命令有可能在默认超时时间 10 秒内统计不完,就会报错退出

增加一个超时参数 -t 秒数,就可以避免这种情况

$ adb shell dumpsys -t 30 meminfo

由于多数情况下,我们更关心某个应用的内存占用,可以指定它的包名或者 PID,去针对性的获得结果

$ adb shell dumpsys meminfo com.android.settings
# 或者
$ adb shell dumpsys meminfo 4603
** MEMINFO in pid 4603 [com.android.settings] **
                   Pss  Private  Private  SwapPss     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap     1318     1276        0        0     6144     3154     2989
  Dalvik Heap      166      148        0        0     1466      954      512
 Dalvik Other      137      136        0        0
        Stack       40       40        0        0
       Ashmem        0        0        0        0
    Other dev        8        0        8        0
     .so mmap      156       64        0        0
    .apk mmap     2148        0     2048        0
    .dex mmap      900        8      820        0
    .oat mmap       75        0        0        0
    .art mmap      477      356        0        0
   Other mmap       10        4        0        0
      Unknown      506      504        0        0
        TOTAL     5941     2536     2876        0     7610     4108     3501

提取 Pss Total 列的 TOTAL 值即可

通过不带包名的命令获得总的内存值,就可以计算占用率了

另外要提醒的是,上述命令执行过程中会消耗一定的 CPU,如果正在统计 CPU,则尽量减少对内存的统计,以免对总 CPU 造成影响

henry.Woo 原创文章 31获赞 6访问量 6820 关注 私信 展开阅读全文
作者:henry.Woo


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

统计 Android 应用的 CPU 和内存

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

统计 Android 应用的 CPU 和内存

Android 系统基于 Linux 的内核构建起来,因此统计应用消耗的内存和占用的 CPU 时非常方便,本文介绍统计 CPU 和内存的命令,以及实现自动化统计的思路 CPU 的统计 Linux 提供了非常简单的一个命令 top,可以查看应
2022-06-06

统计 cpu 内存 使用率的shell脚本代码

#!/bin/shclearwhile ((1>0))do NET=$(netstat -anp | grep 1000 | grep EST | wc -l) PRC=$(ps aux | grep thread1 | grep -v g
2022-06-04

如何使用shell统计CPU、内存、硬盘的使用率

这篇文章主要介绍了如何使用shell统计CPU、内存、硬盘的使用率,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码如下:#!/bin/bash#This script is
2023-06-09

如何实现统计cpu内存和使用率的shell脚本代码

这篇文章主要介绍了如何实现统计cpu内存和使用率的shell脚本代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码如下:#!/bin/shclearwhile ((1>0
2023-06-09

一个用了统计CPU 内存 硬盘 使用率的shell脚本

#!/bin/bash#This script is use for describle CPU Hard Memery Utilizationtotal=0idle=0system=0user=0nice=0mem=0vmexec=/us
2022-06-04

shell脚本监控系统负载、CPU和内存使用情况

在没有nagios监控软件的情况下,只要服务器能上互联网,就可通过发邮件的方式来提醒管理员系统负载与CPU占用的使用情况。一、安装linux下面的一个邮件客户端msmtp软件(类似于一个foxmail的工具)1、下载安装:http://do
2022-06-04

Android内存使用情况的应用实例

Android内存使用情况的应用实例 实现效果图:创建项目 Android清单文件 2022-06-06

如何用shell脚本监控系统负载、CPU和内存使用情况

这篇文章主要讲解了“如何用shell脚本监控系统负载、CPU和内存使用情况”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用shell脚本监控系统负载、CPU和内存使用情况”吧!一、安装l
2023-06-09

Python实现读取Linux系统的CPU以及内存占用

直接贴代码 import subprocessdef get_system_stats():#编程客栈 通过 shell 命令获取 CPU 使用率和内存使用率cpu_command = "top -bn1 | grep '%Cpu(s)'
2023-05-20

Linux系统如何查看主机的cpu总个数和总内存

这篇文章将为大家详细讲解有关Linux系统如何查看主机的cpu总个数和总内存,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、查看cpu总个数第一种方法:top命令法首先执行top命令,如下图所示。在to
2023-06-12

浅谈Android应用的内存优化及Handler的内存泄漏问题

一、Android内存基础 物理内存与进程内存 物理内存即移动设备上的RAM,当启动一个Android程序时,会启动一个Dalvik VM进程,系统会给它分配固定的内存空间(16M,32M不定),这块内存空间会映射到RAM上某个区域。然后这
2022-06-06

Docker Compose中如何限制容器的CPU和内存使用

这篇文章主要为大家介绍了Docker Compose中限制容器的CPU和内存使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-20

doscan.exe进程占用了大量的CPU和内存的解决方法

如果doscan.exe进程占用了大量的CPU和内存,可能是因为该进程在执行某些任务或扫描操作时出现了问题。以下是一些可能的解决方法:1. 终止进程:打开任务管理器,找到doscan.exe进程,右键点击选择“结束任务”来终止进程。这可能会
2023-08-14

Aix命令:列出使用内存和Cpu前几位的进程

(1)显示10个消耗cpu最多的进程  # ps aux |head -1 ;ps aux |sort -rn +2 |head -10  (2)显示10个消耗内存最多的进程  #ps vx |head -1 ;ps vx |grep -v
2023-06-04

Android编程如何实现获取系统内存、CPU使用率及状态栏高度的方法

这篇文章将为大家详细讲解有关Android编程如何实现获取系统内存、CPU使用率及状态栏高度的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文实例讲述了Android编程实现获取系统内存、CPU使用
2023-05-30

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录