Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android上,当应用程序没有';你没有分配任何东西吗?_Android - Fatal编程技术网

在Android上,当应用程序没有';你没有分配任何东西吗?

在Android上,当应用程序没有';你没有分配任何东西吗?,android,Android,我在Android上使用ps命令来确定应用程序(只是一个普通的基于Java的应用程序)正在使用的内存。我有一个测试应用程序,它可以分配尽可能多的内存(通过反复创建1兆字节的数组并将它们添加到列表中,这样它们就不会失去引用,直到分配失败) ps为测试应用程序显示的“RSS”(常驻集大小)列似乎是合理的——当应用程序启动时,它是低的,然后在我分配了大量内存后,它会高得多。但是VSIZE/VSS列一开始非常高,并且没有改变。ps在Android上报告的VSIZE/VSS列的含义是什么 这是在我显式分配

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

ps为测试应用程序显示的“RSS”(常驻集大小)列似乎是合理的——当应用程序启动时,它是低的,然后在我分配了大量内存后,它会高得多。但是VSIZE/VSS列一开始非常高,并且没有改变。ps在Android上报告的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操作系统实际上没有使用页面文件/交换空间吗?我毫不怀疑构建/配置它来实现这一点是可能的,但在正常的库存OS构建中,它是否曾经对存储进行VM分页


谢谢大家

Android应用程序并非以通常的fork()和exec()方式启动,而是以干净的进程映像启动

相反,一个名为zygote的已经运行的程序被指示通过更改应用程序用户ID并加载构成特定应用程序的java(可能是本机的)代码库来派生一个子程序并对其进行专门化

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


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

Android应用程序并非以通常的fork()和exec()方式启动,而是以干净的进程映像启动

相反,一个名为zygote的已经运行的程序被指示通过更改应用程序用户ID并加载构成特定应用程序的java(可能是本机的)代码库来派生一个子程序并对其进行专门化

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


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

谢谢您的回答。那么,您是说显示的RSS列不包括与其他进程共享的VM页面,但VSIZE/VSS列确实包括与其他进程共享的VM页面?谢谢您的回答。那么,您是说显示的RSS列不包括与其他进程共享的VM页面,但VSIZE/VSS列包含与其他进程共享的VM页面?