经常有同学问怎么样监控Android的内存。这里和大家聊聊我对Android内存的理解和获取方法。

一般说来,Android本质是个Linux系统,在操作系统里面,Linux内存使用是个是一个比较复杂和难以理解的。现在我们有很多app可以管理系统的内存,并且提供你Android系统的状态更新的功能。

如果你只关注Android应用层的框架(framework),用ActivityManager.getMemoryInfo方法去获取手机里面内存信息,还可以帮忙我们查看后台进程产生更多的内存信息,还有那些应用需要虚拟机杀掉的服务进程。如果对存java程序,这没什么用,是因为java的堆栈会限制app的进程去避免把内存压力施加给操作系统。

如果我们关注底层的话,我们可以用内核原生态的api获取内存的使用(后面详细给出命令)

回到刚刚说的应用层获取的api方式,我们可以获取三种不同的内存 "Pss", "PrivateDirty", and "SharedDirty"。这三种内存各不相同。

  • VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
  • RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
  • PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
  • USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

在Android系统里面有大量的内存都是靠多个进程共享同一片内存。所以多少内存实际过程中被使用真的是没办法知道。不知道不代表我们没法获取系统现在的内存。还有,你如果把所有RAM(随机存储内存)映射到每个进程中,并且相加,你最终得到的内存比实际内存大许多。

回到刚刚获取的三种内存上来,PSS是物理内存,它是度量一个内核计算,考虑到内存共享基础过程,RAM的每一页的页面也使用其他进程的比例,有了这个,你可以在理论上相加所有物理进程去看整个RAM里面内存使用的总数,并且比较PSS之间的进程来获取他们相对的权值。

另外一个度量是PrivateDirty类似私有内存,基本上RAM里面的内存是不能分页到磁盘内存处理的数据,而且不能和其他进程共享。换句话说PrivateDirty里面的RAM将成为系统可用内存,仅仅是当系统把他划入缓存或者其他用途或者进程被杀死。

故名思议,SharedDirty就是共享内存,这个主要是提供各个进程共享数据等。不做详细讨论。

利用adb桥接命令,我们也可以达到很多运行时系统的内存大量的信息。常见的命令是大家都知道的系统快照 "adb shell dumpsys meminfo"。它可以分割出每个java进程的内存使用情况,包含各种各样其他信息,你也可以加上名字和进程ID(PID)来查看它,比如:

** MEMINFO in pid 890 [system] **native   dalvik    other    totalsize:    10940     7047      N/A    17987allocated:     8943     5516      N/A    14459free:      336     1531      N/A     1867(Pss):     4585     9282    11916    25783(shared dirty):     2184     3596      916     6696(priv dirty):     4504     5956     7456    17916ObjectsViews:      149        ViewRoots:        4AppContexts:       13       Activities:        0Assets:        4    AssetManagers:        4Local Binders:      141    Proxy Binders:      158
Death Recipients:       49OpenSSL Sockets:        0SQLheap:      205          dbFiles:        0numPagers:        0   inactivePageKB:        0activePageKB:        0

这一段主要是在Size这一行,它表示是整个制定的堆栈空间地址空间总的内存大小,allocated这一行是实际堆的分配空间KB为单位,free是额外剩余的堆栈空间大小,后面的pss和priv dirty是前面扯到的每个堆栈的页面指定的分配空间。

如果你仅仅想产科所有进程使用的内存,你用"adb shell procrank"这个命令就好了,运行后如下显示:

 PID      Vss      Rss      Pss      Uss  cmdline890   84456K   48668K   25850K   21284K  system_server1231   50748K   39088K   17587K   13792K  com.android.launcher2947   34488K   28528K   10834K    9308K  com.android.wallpaper987   26964K   26956K    8751K    7308K  com.google.process.gapps954   24300K   24296K    6249K    4824K  com.android.phone948   23020K   23016K    5864K    4748K  com.android.inputmethod.latin888   25728K   25724K    5774K    3668K  zygote977   24100K   24096K    5667K    4340K  android.process.acore
...59     336K     332K      99K      92K  /system/bin/installd60     396K     392K      93K      84K  /system/bin/keystore51     280K     276K      74K      68K  /system/bin/servicemanager54     256K     252K      69K      64K  /system/bin/debuggerd

Vss和Rss是基本的数据,Pss是物理内存,Uss差不多就是private Dirty。一般说来,USS和Pss都大于我们看到的内存信息。这是为什么呢?与内存信息本身相比,procrank用了不同内核机制去收集它们数据信息,这样才与实际结果不同。这个procrank类似在一个粮仓采取一点米粒大小的粮食,这也许是它收集内存信息不太准确的原因。

最后有个命令adb shell cat /proc/meminfo"给出了系统总的内存使用的总量。在大量的数据里面,只有很少的数据和信息值得去讨论:

MemTotal:         395144 kB
MemFree:          184936 kB
Buffers:             880 kB
Cached:            84104 kB
SwapCached:            0 kB

memtotal是内核和用户空间可用内存的总量,通常比设备的实际物理内存要少一些,因为RAM需要有缓存。

MemFree是不被使用的内存。通常我们看到的比较高,通常在Android系统仅仅只有几MB,因此我们试图用可用的内存来保持进程是可以运行的。

Cached是内存用于缓存文件系统做这样的事情。典型的情况是系统需要20MB空间去避免寻道坏的区域页面,Android系统杀手是可以被调节到特殊系统,为了确保后台进程被杀死之前去缓存RAM消耗了太多,而导致像这样的分页。

原文链接:http://stackoverflow.com/questions/2298208/how-do-i-discover-memory-usage-of-my-application-in-android

金阳光测试

新浪微博:金阳光woody

网站地址

1、百度搜:金阳光测试

2、官网:www.goldensunshine.cc

微信公众号

Android性能测试初谈--内存分析(金阳光)相关推荐

  1. 【金阳光测试】大话Android自动化测试--Android自动化系列(1)--金阳光于2013年4月份

    Android自动化测试框架和工具在四年多的发展日趋成熟.从五年前的第一代自动化架构演进到目前第四代(本系列讲座第7篇后将详细剖析第三代和第四代自动化框架)从以前最早谷歌推崇的monkey随机测试工具 ...

  2. Android 中图片占用内存分析

    Android 在加载图片的时候一定会考虑到的一个点就是如何防止 OOM,那么一张图片在加载的时候到底会占用多少内存呢?有哪些因素会影响占用的内存呢?知道了这些,我们才能知道可以从哪些点去优化,从而避 ...

  3. android性能测试 内存,测试基础之Android性能测试一:内存

    手机系统内存是一种随机存取存储器(RAM),高速存取,读写时间相等,且与地址无关.存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器.这种存储器在断电时将丢失其存储内容,故主 ...

  4. android应用内存分析,Android应用程序内存分析-Memory Analysis for Android Applications

    Android应用程序内存分析 原文链接:http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html ...

  5. 大话Android自动化测试--金阳光自动化测试Android系列(1)--金阳光于2013年4月份

    本文转载来自:金阳光老师的csdn博客:http://blog.csdn.net/haorenmin2008 Android自动化测试框架和工具在四年多的发展日趋成熟.从五年前的第一代自动化架构演进到 ...

  6. 【金阳光测试】Android自动化测试第一季第零讲--预备知识

    百度传课: http://www.chuanke.com/v1983382-106000-218422.html http://www.chuanke.com/v1983382-106000-2184 ...

  7. 【金阳光测试】Android自动化 -- 学习历程:自动化预备知识上下

    章节:自动化基础篇--自动化预备知识上&&下 网易云课堂: 上:http://study.163.com/course/courseLearn.htm?courseId=712011# ...

  8. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析

    在前面一篇文章Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析中,我们系统地介绍了Android系统匿名共享内存的实现原理,其中着重介绍了 ...

  9. Android性能测试-内存

    前言: 近阶段都在探索android性能测试方面的东西,其中一个很重要的指标就是内存.对于内存,主要是一些gc是不是及时,或者说一些引用有没有及时释放,有没有导致oom或者内存持续增加导致卡顿,有没有 ...

最新文章

  1. IronPython系列:Composite Pattern及其实现
  2. 多帧点云数据拼接合并_多工作簿数据合并,还在手动复制粘贴就out了,用批处理一键搞定...
  3. 小波变换原理_小波变换的知识,转载的
  4. 给排水规范大全2020_住宅电气、给排水、消防安装工程的质量通病分析
  5. 部署腾讯云(CentOS6.6版本,jdk1.7+tomcat8+mysql)
  6. Base64编码流程
  7. 大数据处理系统,分布式存储系统和分布式计算框架介绍
  8. 电脑黑屏只有鼠标箭头怎么修复 电脑开机黑屏的修复办法
  9. js - 数学运算(取整,取余)
  10. 【云原生之Docker实战】使用Docker部署MrDoc个人在线文档系统
  11. 解决IE浏览器没有网络的情况
  12. 技术总监的“技术提升”
  13. Android 键盘输入管理
  14. Error: IMA Service Error Message -2147483647 群里解决问题收集的 (一飞出品)
  15. fatal: unable to auto-detect email address (got ‘tim@newton.(none)‘)
  16. 贾扬清从阿里毕业了!
  17. Shiro框架使用及配置之权限管理系统(1)
  18. 密码编码学与网络安全(2):对称密码之传统加密技术
  19. nodejs 工作线程的基本使用(worker_threads)
  20. 安全路上慢慢走,持续更新

热门文章

  1. python发送qq邮件失败_Python实现给qq邮箱发送邮件的方法
  2. Cocos2dx.3x入门三部曲-Hello Game项目解析(三)
  3. IDEA常用快捷键及设置方法
  4. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java管理系统c4ki9
  5. 每日学术速递2.21
  6. linux开启关闭Redis
  7. MySQL 实战45讲--笔记
  8. 展锐平台的camera sensor驱动代码设计解析(2)
  9. OpenFlow:简述对OpenFlow协议1.0的认识
  10. 一篇文章发在一个微信上,吸引来3000个代理