Dalvik Virtual Machine采用的尺寸

时间:2012-12-07 03:50:42

标签: android virtual-machine dalvik android-framework

我试图了解为Android中的每个进程分配了多少内存。据我了解,每个应用程序进程都有一个独立的Zygote进程实例,Zygote将分叉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进程占用的大小?
  3. 对于Dalvik及其调用方式以及VM在每个进程中占用的内存,我的理解可能是错误的。

    欢迎任何见解。

    感谢。

1 个答案:

答案 0 :(得分:5)

好的,我等了很长时间才期待专家回答这个问题。让我与大家分享我所知道的。

回答第一个问题:“如果每个应用程序进程包含Dalvik VM,是否会占用更多内存?”

Dalvik堆由zygote预加载类和数据(从Android 2.2版开始加载超过1900个类)。当zygote分支启动Android应用程序时,新应用程序获得此堆的写时复制映射。正如Dan Borstein在下面所说,这有助于减少内存和应用程序启动时间。

It's used in Android to amortize the RAM footprint of the large amount of effectively-read-only data (technically writable but rarely actually written) associated with common library classes across all active VM processes. 1000+ classes get preloaded by the system at boot time, and each class consumes at least a little heap for itself, including often pointing off to a constellation of other objects. The heap created by the preloading process gets shared copy-on-write with each spawned VM process (but again doesn't in practice get written much). This saves hundreds of kB of dirty unpageable RAM per process and also helps speed up process startup.

对于你的2个问题:“我们怎么知道VM占用的内存大小和Java进程占用的大小?”

为了清楚dalvik中的内存,我不明白'Java进程'check链接占用的大小是什么意思。

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