Dalvik Virtual Machine采用的尺寸

pri*_*aul 3 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进程占用的大小?

我对Dalvik的理解可能是错误的,以及如何调用它以及VM在每个进程中占用的内存.

任何见解都是受欢迎的.

谢谢.

Imp*_*ter 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进程占用的大小?"

我不明白你的意思是'Java进程占用的大小' 检查链接,以清楚了解dalvik中的内存.

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