2012-12-07 67 views
3

我想了解多少内存分配给Android中的每个进程。据我了解,每个应用程序进程都有一个独立的Zygote进程实例,Zygote将分叉Dalvik VM。由Dalvik虚拟机采取的大小

我写了一个小样本的Java应用程序,它只是在一个循环中打印“hello world”。稍后通过ADB shell调用Dalvik VM。现在,Procrank命令显示,

PID Vss的RSS PSS的USS CMDLINE 9374 7556K 7556K 3600K 3384K dalvikvm

USS其在此处展示为3384k。

后来,我写了一个带有一个activity和TextView的小型android程序。现在procrank显示

PID Vss的RSS PSS的USS CMDLINE 6540 37256K 35124K 4387K 3392K com.example.helloworld

我的问题是:

  1. 如果每个应用程序包含Dalvik虚拟机,不会吧需要更多的记忆?
  2. 我们怎么知道,VM占用的内存大小和Java进程占用的大小?

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

任何见解都是值得欢迎的。

谢谢。

回答

4

好吧,我等了很长时间,期待这个问题的专家解答。让我分享你我所知道的。

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

Dalvik堆预装了zygote的类和数据(在Android 2.2版本中加载超过1900个类)。当zygote分支来启动一个android应用程序时,新的应用程序会得到这个堆的copy-on-write映射。正如Dan Borstein所说,这有助于减少内存和应用程序启动时间。

It's used in Android to amortize the RAM footprint of the large amount of effectively-read-only data (technicallywritable 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, includingoften pointing off to a constellation of other objects. The heap created by the preloading process getsshared copy-on-write with each spawned VM process (but again doesn't in practice get written much). This saveshundreds of kB of dirty unpageable RAM per process and also helps speed up process startup.

要在2问题:“我们怎么知道,内存的虚拟机所占用的尺寸以及Java进程占用的大小”

我不明白你的意思是'Java进程占用的大小'check链接为清晰dalvik中的内存。

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