Dalvik虚拟机占用的空间大小

3
我正在尝试理解Android中每个进程分配了多少内存。据我所知,对于每个应用程序进程,都有一个单独的Zygote进程实例,并且Zygote将fork Dalvik VM。
我编写了一个简单的Java应用程序示例,它只是在循环中打印“hello world”。稍后通过ADB shell调用了Dalvik VM。现在,Procrank命令显示:
PID Vss Rss Pss Uss cmdline 9374 7556K 7556K 3600K 3384K dalvikvm
这里显示的USS为3384k。
后来,我编写了一个带有一个活动和TextView的小型Android程序。现在procrank显示:
PID Vss Rss Pss Uss cmdline 6540 37256K 35124K 4387K 3392K com.example.helloworld
我的问题是:
1.如果每个应用程序进程都包含Dalvik VM,那么它不会占用更多的内存吗? 2.我们如何知道VM占用的内存大小和Java进程占用的内存大小?
关于Dalvik以及如何调用它以及每个进程中VM占用的内存大小,我的理解可能是错误的。
欢迎任何见解。
谢谢。
1个回答

5

好的,我等待了相当长的时间,期望得到这个问题的专家答案。让我分享一下我所知道的。

回答第一个问题:“如果每个应用程序进程都包含Dalvik VM,那么它不会占用更多的内存吗?”

Dalvik堆由zygote预加载类和数据(截至Android 2.2版本已加载超过1900个类)。当zygote分叉启动Android应用程序时,新应用程序获得此堆的写时复制映射。如下所述,这有助于减少内存使用量以及应用程序启动时间。

在Android中,它被用来分摊大量有效只读数据(技术上可写但实际上很少写入)与所有活动VM进程关联的常见库类。系统在引导时预加载1000多个类,每个类至少消耗一点堆空间,包括通常指向其他对象的星座。预加载过程创建的堆与每个生成的VM进程共享写时复制(但实际上很少被写入)。这样可以为每个进程节省数百KB的脏不可分页RAM,并加快进程启动速度。

对于你的第二个问题:“我们如何知道VM占用的内存大小和Java进程占用的内存大小?”

我不明白你所说的“Java进程占用的内存大小”是什么意思,请查看链接以了解Dalvik中的内存。

除了procrank,我们还可以使用adb shell dumpsys meminfo 'your apps package name'请查看此链接以获取有关dumpsys的更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接