0

我在 Android 上使用 ps 命令来确定应用程序正在使用的内存(只是一个普通的基于 Java 的应用程序)。我有一个测试应用程序,它分配尽可能多的内存(通过重复创建 1 MB 字节数组并将它们添加到列表中,这样它们就不会超出参考,直到分配失败)。

ps 为测试应用程序显示的“RSS”(驻留集大小)列似乎是明智的 - 当应用程序启动时它很低,然后在我分配了一堆内存之后它会高得多。但是 VSIZE/VSS 列一开始就很高,而且不会改变。Android上ps报告的VSIZE/VSS列是什么意思?

这是我显式分配任何内存之前我的测试应用程序的 ps 输出。单位是千字节

USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
u0_a55    2271  91    468664 30008 ffffffff 00000000 S com.dave.quicktest

这是在我分配内存直到耗尽之后:

USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
u0_a55    2271  91    468692 287232 ffffffff 00000000 S com.dave.quicktest

RSS 从 30mb 增加到 287mb,这个差异大致与分配的内存量相匹配。但 VSIZE 一开始是 468mb,变化不大。为什么?

另外,我可以确认 Android 操作系统实际上不使用页面文件/交换空间吗?我不怀疑可以构建/配置它来这样做,但在正常的库存操作系统构建中,它是否曾经对存储进行 VM 分页?

多谢你们!

4

1 回答 1

5

Android 应用程序不会以通常的 fork() 和 exec() 方式启动,这意味着使用干净的进程映像。

取而代之的是,一个名为 zygote 的已运行程序被指示通过更改应用程序用户 ID 并加载构成特定应用程序的 java(可能是本机)代码库来分叉一个子程序并专门化它。

这种奇怪行为的原因是 zygote 已经“加载”了大多数系统提供的 java 和 Android 应用程序可能想要使用的本地库。由于这些代码页主要包含只读代码页,因此子进程几乎可以免费继承对它们的访问 - 无需为每个程序将新副本加载到内存中。并且只有在实际写入时才会复制正在运行的实例可能需要的少数相关数据页。因此,在资源受限的多处理系统上,它是一种非常有效的方案,可以最大限度地减少重复内存的使用。

但是,由于所有这些库,无论是否需要,都映射到每个应用程序的地址空间并且理论上可用,因此每个应用程序的虚拟内存大小会显得相当高。

于 2013-05-06T16:05:46.113 回答