Размер, взятый виртуальной машиной Dalvik

Я пытаюсь понять, сколько памяти выделяется для каждого процесса в Android. Насколько я понимаю, для каждого процесса приложения существует отдельный экземпляр процесса Zygote, и Zygote будет форкнуть Dalvik VM.

Я написал небольшой пример java-приложения, которое просто печатает «привет, мир» в цикле. Позже вызвал Dalvik VM через оболочку ADB. Теперь команда Procrank показывает, что

PID Vss Rss Pss Uss cmdline 9374 7556K 7556K 3600K 3384K dalvikvm

USS, который показан здесь, составляет 3384k.

Позже я написал небольшую программу для Android с одним действием и TextView. Теперь прокран показывает

PID Vss Rss Pss Uss cmdline 6540 37256K 35124K 4387K 3392K com.example.helloworld

Мои вопросы:

  1. Если каждый процесс приложения содержит виртуальную машину Dalvik, не потребуется ли для этого больше памяти?
  2. Откуда мы знаем, какой объем памяти занимает ВМ и сколько занимает Java-процесс?

Мое понимание может быть неверным в отношении Dalvik и того, как он вызывается, и памяти, занимаемой виртуальной машиной в каждом процессе.

Любые идеи приветствуются.

Спасибо.


person prijupaul    schedule 07.12.2012    source источник


Ответы (1)


Хорошо, я ждал довольно долго, ожидая экспертного ответа на этот вопрос. Позвольте мне поделиться с вами тем, что я знаю.

Ответ на первый вопрос: «Если каждый процесс приложения содержит виртуальную машину Dalvik, не потребуется ли ему больше памяти?»

Куча Dalvik предварительно загружается классами и данными с помощью zygote (загружается более 1900 классов, начиная с версии Android 2.2). Когда zygote разветвляется для запуска приложения Android, новое приложение получает сопоставление этой кучи с копированием при записи. Как говорит ниже Дэн Борштейн, это помогает уменьшить объем памяти, а также время запуска приложения.

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 вопрос: "Откуда мы знаем, размер памяти, занимаемой ВМ, и размер, занимаемый Java-процессом?"

Я не понял, что вы подразумеваете под «размером, занимаемым процессом Java» android/2299813#2299813">проверьте ссылку для ясности о памяти в dalvik.

В дополнение к procrank мы также можем использовать adb shell dumpsys meminfo 'your apps package name' для получения дополнительной информации о dumpsys.

person Imposter    schedule 21.01.2013