2012-12-07 109 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的更多信息。