文档章节

Android上的内存监测

每天多一点
 每天多一点
发布于 2014/05/05 17:39
字数 1108
阅读 134
收藏 0
点赞 0
评论 0

Android平台上监测内存的手段主要有如下几种:

1. proc下的meminfo句柄(Linux上通用)

adb shell cat /proc/meminfo

得到的信息类似如下:

MemTotal:        1966140 kB
MemFree:          363148 kB
Buffers:           88184 kB
Cached:           637936 kB
SwapCached:            0 kB
Active:           991268 kB
...

可以看到内存的使用量为1966240 - 363148 - 88184 - 637936

上面的free memory的计算方法是 free memory = MemFree + Cached +Buffers

也有一种说法是free memory = MemFree + Cached


2. 使用vmstat工具

Android上提供了vmstat的移植,使用如下的命令就可以得到内存和cpu的使用量

adb shell vmstat

之后vmstat就会持续输出相关的信息。

 r  b    free mapped   anon   slab    in   cs  flt  us ni sy id wa ir
 1  0  321972 153012 630188  83180   168  348    0   2  0  1 96  0  0
 1  0  321972 153012 630188  83180   180  355    0   0  0  0 96  0  0
 2  0  321972 153012 630192  83180   201  407    0   3  0  0 93  0  0
 1  0  321972 153012 630192  83180   205  389    0   3  0  1 95  0  0

其中,

r 代表在运行队列中等待的进程数
b代表在等待io的进程数

使用 vmstat -h 可以得到参数帮助。

注意,如果在host PC上使用adb shell vmstat可以将输出重定向到本地文件,而在目标机器上直接运行vmstat是无法重定向的。这里有一个解决方案,供参考,需要重新编译vmstat。

vmstat不但可以显示内存的使用情况,还包括进程数以及cpu占用。一个比较典型的应用是根据'r'和'b'的数量来判断是否有卡顿的产生。vmstat一个比较大的局限在于只能输出全局的信息,无法针对某一个进程的信息。


3. 使用Procrank工具(限于ENG版本)。

Android提供了Procrank工具来监测内存的使用情况,可以配合showmap等工具来分析内存的使用。

使用命令如下:

adb shell procrank

然后可以得到如下的输出:


这里主要需要看懂几个定义:

VSS:进程可以访问到的所有内存的总量,一般来说很少用VSS来衡量进程的内存占用。

RSS:进程在RAM中所占用的内存,因为其包含共享库的内存量,所以用其来衡量独立进程的内存使用是不精确的。

PSS:也是进程在RAM中所占用的内存。区别于RSS的地方是,其将分摊共享库在内存中的占用分摊到了使用这个共享库的所有进程。

USS:进程私有的内存占用量。

如果想看看进程内存分配的详细情况,可以通过如下的命令

adb shell showmap [pid]

例如xxx可以得到如下的输出:



4. dumpsys meminfo命令

在Android上可以使用dumpsys命令来获得系统当前的状态信息。其中,就有内存信息。如果使用meminfo参数,我们能够给快速的得到想要的内存占用信息

adb shell dumpsys meminfo [package name]

例如:

adb shell dumpsys meminfo com.android.systemui

可以得到如下的输出:

Applications Memory Usage (kB):
Uptime: 44722331 Realtime: 153834350

** MEMINFO in pid 1151 [com.android.systemui] **
                         Shared  Private     Heap     Heap     Heap
                   Pss    Dirty    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------
       Native       24        4       24    10548     8800      327
       Dalvik    21110     5224    21004    22008    18668     3340
       Cursor        2        4        0                           
       Ashmem        0        0        0                           
    Other dev     8048     4092     6020                           
     .so mmap     1781     2108     1396                           
    .jar mmap        0        0        0                           
    .apk mmap      434        0        0                           
    .ttf mmap      325        0        0                           
    .dex mmap     1187      180       44                           
   Other mmap      220       12      204                           
      Unknown     6788      392     6784                           
        TOTAL    39919    12016    35476    32556    27468     3667
 
 Objects
               Views:      553         ViewRootImpl:        3
         AppContexts:       39           Activities:        0
              Assets:        5        AssetManagers:        5
       Local Binders:       84        Proxy Binders:       62
    Death Recipients:        1
     OpenSSL Sockets:        0
 
 SQL
         MEMORY_USED:        0
  PAGECACHE_OVERFLOW:        0          MALLOC_SIZE:        0


5. top命令

adb shell top

可以得到如下的输出

User 3%, System 12%, IOW 0%, IRQ 0%
User 11 + Nice 0 + Sys 41 + Idle 287 + IOW 0 + IRQ 0 + SIRQ 0 = 339
  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
11307  0   9% R     1   1536K    788K     shell    top
17247  0   3% S     5   4488K    244K     shell    /sbin/adbd
 1320  2   1% S    37 876704K  46504K  fg u0_a13   android.process.media
11303  0   0% S     1      0K      0K     root     kworker/0:2
 1576  0   0% S     6   7620K    872K     root     /system/bin/mpdecision
 2148  1   0% S    29 879988K  55940K  fg system   com.miui.networkassistant
  289  0   0% S    12  70524K   8652K  fg system   /system/bin/surfaceflinger
 1151  0   0% S    34 915408K  70368K  fg system   com.android.systemui
10597  0   0% S     1      0K      0K     root     kworker/u:6
  139  0   0% S     1      0K      0K     root     mmcqd/0

内存相关的是VSS和RSS,定义可以参考#3的记载。

参考资料: 一个关于Android内存比较好的回答在这里

© 著作权归作者所有

共有 人打赏支持
每天多一点
粉丝 10
博文 10
码字总数 8562
作品 0
大连
程序员
系统角度解读Android P新特性

  先做个安利,大家都知道我们之前开源了一个AspectJ的封装库,现在,AspectJX 要了一次重大版本更新 —— 2.0.0 !!!   * 支持Instant Run编译   * 废弃 includeJarFilter和exclude...

Android群英传 ⋅ 04/25 ⋅ 0

Android Flutter 内存机制初探

阿里妹导读:闲鱼技术团队一直在探索如何使用Flutter来统一移动App开发。移动设备上的资源有限,内存使用成了日常开发中的常见问题。那么,Flutter是如何使用内存,又会对Native App的内存带...

b0q8cpra539hafs7 ⋅ 05/23 ⋅ 0

Android 内存泄露的几中场景

title: Android 内存泄露的几中场景 date: 2016-11-22 13:57 tags: Android Android 内存泄漏 java 存在一个垃圾回收机制,发生泄漏的原因就是应该被回收的垃圾没有被回收,这种情况就叫做内...

WooiiiWooiii ⋅ 2016/12/21 ⋅ 0

Android系统源码分析团体项目BeesAndroid正式上线啦

嗨,BeesAndroid开源技术小组正式成立啦,Bees,即蜜蜂,取义分享、合作与奉献的意思,这也是BeesAndroid小组的宗旨,我们第一个团体项目BeesAndroid也于2018年3月6日同步上线,该项目的前 ...

郭孝星 ⋅ 03/08 ⋅ 0

Android中常见的内存泄漏及解决

1.Handler引起的内存泄漏 原因:该线程持有Handler的引用,而Handler也持有Activity的引用,这就导致了Activity不再使用时,GC回收不了Activity 解决:Handler持有的引用最好使用弱引用,在A...

牛板腩天下第一 ⋅ 05/03 ⋅ 0

Android基础性能数据获取(api或/proc/读取)

主要资料参考 Android系统源码在线查看网址 Linux平台Cpu使用率的计算 腾讯开源移动端性能测试APP:GT 3.1 内存篇 内存:表示当前进程内存的使用情况,内存占用过高可能会引起内存抖动,或O...

某杰 ⋅ 05/07 ⋅ 0

Android 性能优化:手把手教你优化Bitmap图片资源的使用

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的Bitmap 使用优化,希望你们会喜欢 目录 1. 优化原因 即 为什么要优化图片资源,具体如下图:

Carson_Ho ⋅ 04/24 ⋅ 0

Android 面试技能树梳理

相信大家都有面试的经历,相对比面试官的问的一些问题其实都是基础的知识,但就是一些基础的知识我们也不是很完美的回答出来,我们也知道现在的开发人员很多,一家公司一个岗位就会有很多的开...

liu3364575 ⋅ 05/05 ⋅ 0

Android性能优化:手把手带你全面实现内存优化

前言 在 Android开发中,性能优化策略十分重要 本文主要讲解性能优化中的内存优化,希望你们会喜欢 目录 1. 定义 优化处理 应用程序的内存使用、空间占用 2. 作用 避免因不正确使用内存 & 缺...

codeGoogle ⋅ 05/08 ⋅ 0

Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)

前言 在 开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性、流畅性、稳定性等,是提高用户留存率的关键 本文全面讲解性能优化中的所有知识,献上一份 性能优化的详细攻...

Carson_Ho ⋅ 05/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Linux kernel脉络和主干总结

写在前面 前人常说,对Linux操作系统/内核的理解,是计算机行业从业者的内功,决定了你在技术领域想走多远。但内核的庞大以及学习曲线之陡峭,总让我在学习途中觉得犹如“管中窥豹”。 随着工...

Markz0928 ⋅ 28分钟前 ⋅ 0

在gcc中使用intel风格的内联汇编

很简单,内联汇编使用asm(“.intel_syntax noprefix/n”)声明一下,以后的内联汇编就可以用intel风格了,构建可执行文件时给gcc加上-masm=intel参数。 先写一个小程序测试一下: [cpp] view...

simpower ⋅ 38分钟前 ⋅ 0

NIO 之 ByteBuffer实现原理

相关文章 BIO、NIO、AIO 内部原理分析 NIO 之 Selector实现原理 NIO 之 Channel实现原理 前言 Java NIO 主要由下面3部分组成: Buffer Channel Selector 在传统IO中,流是基于字节的方式进行...

轨迹_ ⋅ 47分钟前 ⋅ 0

Jenkins docker权限问题

环境Ubuntu Server 工具 jenkins-war:2.89.2 报错信息 Cannot connect to the Docker daemon. Is the docker daemon running on this host?Build step 'Execute shell' marked build as fai......

Pulsar-V ⋅ 48分钟前 ⋅ 0

180621-一个简单的时间窗口设计与实现

如何设计一个计数的时间窗口 时间窗口,通常对于一些实时信息展示中用得比较多,比如维持一个五分钟的交易明细时间窗口,就需要记录当前时间,到五分钟之前的所有交易明细,而五分钟之前的数...

小灰灰Blog ⋅ 今天 ⋅ 0

Android之Dalvik、ART、JIT、AOT

Android之Dalvik、ART、JIT、AOT 本文内容:Dalvik、ART、JIT、AOT之间关系 本文定位:知识记录 学习过程记录,加深理解,提升文字组合表达能力。也希望能给学习的同学一些灵感 本文整理于[...

lichuangnk ⋅ 今天 ⋅ 0

Thrift RPC实战(五) thrift连接池

Thrift本身没有提供连接池,我们可以用Apache Commons Pool2来实现一个 一、定义对象工厂 BasePooledObjectFactory<T> extends BaseObject implements PooledObjectFactory<T> public class......

lemonLove ⋅ 今天 ⋅ 0

git 命令简写

简写 命令 g git gst git status gd git diff gdc git diff --cached gdv git diff -w "$@" | view - gl git pull gup git pull --rebase gp git push gc git commit -v gc! git commit -v ......

charley158 ⋅ 今天 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧四-类和方法注释模板设置

IDEA自带的注释模板不是太好用,我本人到网上搜集了很多资料系统的整理了一下制作了一份比较完整的模板来分享给大家,我不是专业玩博客的,写这篇文章只是为了让大家省事。 这里设置的注释模...

Mkeeper ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部