首页 > Android, C/C++/Linux, System > Android中的内存使用状况统计

Android中的内存使用状况统计

2012-05-27 18:47 星期日    浏览: 6,253    绿 发表评论 阅读评论

based on android 2.3.5

1. Android中的内存使用状况统计

在Android的“正在运行服务”中有关于“已用空间”和“可用空间”的统计,但它不是通常意义(传统Linux)上的内存使用情况统计,而是基于Low Memory Killer和Android虚拟机的Activity堆栈上的可用内存统计。因为在传统程序中,程序退出后内存即释放;但是在Android中,即使按back键返回后,为了使用缓存提高性能,Acitivity实例还有可能保存在堆栈上。基于这种设计理念,它的统计数据也不同于传统意义上的统计数据(如Linux下的free命令和/proc/meminfo)。

在”设置-应用程序-正在运行的服务”中,可以看到如下截图(HTC chacha 810e):

图中最下面一行列出了已用空间和可用空间。那么这两个数值是怎么得到的呢?查看该图对应的代码packages/apps/Settings/src/com/android/settings/applications/RunningProcessesView.java

字符串“已用空间”通过字符串id号service_foreground_processes得到,“可用空间”通过字符串id号service_background_processes得到。

因此,可知“已用空间”的值为:

String sizeStr = Formatter.formatShortFileSize(getContext(),
mLastForegroundProcessMemory + mLastServiceProcessMemory);

也就是说,已用空间的表示前台进程和后台服务占用的空间。

可用空间的字符串值为:

String sizeStr = Formatter.formatShortFileSize(getContext(),
mLastAvailMemory + mLastBackgroundProcessMemory);

它表示可用的内存加上后台程序占用的空间。那么程序和Service占用的空间具体指什么呢?

在RunningState.java中,统计了前台程序和后台程序以及Service所占用的空间(由三种PSS相加)。PSS 是Proportional Set Size的缩写,表示 实际使用的物理内存,因为进程之间经常共享.so库,所以PSS是按比例分配共享库后占用的物理内存。这三种PSS在framework/base/core/java/android/os/Debug.java中的MemoryInfo中:

/** The proportional set size for dalvik. */
public int dalvikPss;

/** The proportional set size for the native heap. */
public int nativePss;

/** The proportional set size for everything else. */
public int otherPss;

再来看一下上面的mLastAvailMemory(即availMem):

 long availMem = readAvailMem() – SECONDARY_SERVER_MEM;

在readAvailMem中,根据/proc/meminfo文件中的MemFree和Cached两项的值计算出Avail的值,还要减去SECONDARY_SERVER_MEM(属性ro.SECONDARY_SERVER_MEM通常在build/target/board/generic_x86/init.rc中设定为4096,因此该块内存为4096*PAGE_SIZE=16MB)

因此,“可用空间”表示闲置的内存(free+cached)+后台进程占用的空间-预留的空间(SECONDARY_SERVER_MEM,通常为16MB)。因为Low Memory Killer的作用,在内存较少时,可以释放后台程序的进程空间,所以包含了后台程序的空间。

另附1:

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

可以使用procrank查看Android系统的各进程的VSS/RSS/PSS/USS的值。

另附2:LinearColorBar是个LinaerLayout。按mLastForegroundProcessMemory/ mLastServiceProcessMemory/mLastBackgroundProcessMemory三者占用比确定RGB颜色,见代码LinearColorBar.java中的setRatios。

2. Linux系统的传统内存使用情况统计

free命令和/proc/meminfo

Linux下的free命令用于查看系统内存使用情况,我的PC机上的Ubunt10.04的free命令执行结果如下:

 

上面的 totoal(1018216KB)是总内存数量,used(992664KB)表示已经使用的数量, free(25552KB)表示空闲数量。其中,total(1018216KB)=used(992664KB)+free(25552KB)。后面的buffers(9700)表示往磁盘空间里“写”的缓冲区大小,cached表示“读”的数据的缓存,它们属于used的一部分。二者可以快速变为可用内存,使用它们出于改善系统IO性能的目的。当不把二者计入时,系统uesd和free的统计值就是下面的一行(-/+ buffers)因此:uesd:749728=992664-9700-233236,free:25552+9700+233236=268488

最下面的一行表示交换到磁盘空间的内存。

而在Android手机上,用法基本相同,下图是htc chacha 810e(2.3)的执行情况。

bill@Ubuntu10:~/android-sdk-linux_x86/platform-tools$ ./adb shell free;./adb shell cat /proc/meminfo

结果截图如下:

free命令没有列出cached这一项,因此第三行(-/+buffers)的第一个值415716表示不计入buffers时uesed的值(即422732-7016=415716),第二个值表示计入buffers时free的值(即12636=5620+7016)。meminfo中包含了Cached的值。

3. 总结

因为Android中的一些新特性,所以其内存统计也是基于这些新的用法之上。Android又使用的是Linux内核,所以某些概念容易混淆。

本文链接地址: http://blog.redwolf-soft.com/?p=1551

原创文章,版权©红狼博客所有, 转载随意,但请注明出处。

    分享到:

相关文章:

  • 无相关文章
  1. apt
    2012年10月17日16:57 | #1

    大哥~图片链接好像有点问题哦

  2. BillYang
    2012年10月20日10:40 | #2

    抱歉,现已补上@apt

  3. BoaHanHancock
    2013年10月12日10:44 | #3

    IT大师兄,请问一下,关于获取SECONDARY_SERVER_MEM,我看了源代码,里面使用的方法是:
    // Magic! Implementation detail! Don’t count on this!
    SECONDARY_SERVER_MEM =
    Integer.valueOf(SystemProperties.get(“ro.SECONDARY_SERVER_MEM”))*PAGE_SIZE;
    当我调用这个方法的时候,结果返回的是: 空! (意料之中?)
    然后我想请问一下,我应该怎么来获取这个:SECONDARY_SERVER_MEM,请问有什么方法吗?谢谢了。
    到处看到的都是你的帖子的转帖,还是本尊的好啊,可以跟你交流提问 :)

    • BillYang
      2013年10月15日14:56 | #4

      可以在adb下使用命令getprop去查看该属性的值,具体用法可以网上查一下。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
订阅评论
  欢迎参与讨论,请在这里发表您的看法、交流您的观点。