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://www.redwolf-blog.com/?p=1551
原创文章,版权©红狼博客所有, 转载随意,但请注明出处。