2013-05-06 18 views
0

我在Android上使用ps命令来确定应用程序正在使用的内存(只是一个普通的基于Java的应用程序)。我有一个测试应用程序,它分配尽可能多的内存(通过重复创建1兆字节的数组并将它们添加到列表中,以便它们不会超出引用范围,直到分配失败)。在Android上,当应用程序未分配任何内容时,为什么ps命令会显示高虚拟内存?

的“RSS”(驻留集大小)的PS用于测试应用中显示的列似乎是合理的 - 当应用程序启动时,它是低,再经过我已经分配大量内存是高得多。但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操作系统不会在实践中使用的页面文件/交换空间?我不怀疑有可能构建/配置它,但是在正常的库存操作系统构建中,它是否会对存储进行虚拟机分页?

谢谢你们!

回答

5

Android应用程序不是以通常的fork()和exec()方式启动,而是使用干净的过程映像。

相反,已经运行的程序调用的受精卵被指示关闭叉子并通过改变到应用程序的用户ID和加载的Java(和潜在的天然的)代码库,其形成的特定应用专门它。

这样做的原因奇怪的行为是受精卵已经“装”最系统提供的Java和本机库,供Android应用程序可能需要使用的。由于这些主要包含只读代码页,因此子进程几乎可以免费访问它们 - 不需要为每个程序加载新副本到内存中。并且只有在实际写入时才会复制运行实例可能需要的少数关联数据页。所以这是一个非常有效的方案,用于在资源受限的多处理系统上最小化重复内存使用。

然而,因为所有这些库,需要与否,都映射到每个应用程序的地址空间,并从理论上可用的,每个应用程序的虚拟内存的大小会出现相当高的。

+0

感谢您的回答。那么你是说,do _not_显示的RSS列包含与其他进程共享的VM页面,但VSIZE/VSS列_does_包含与其他进程共享的VM页面? – 2013-05-06 17:29:33

相关问题