Подтвердить что ты не робот

Делает ли Dalvik VM процесс выпуска оперативной памяти?

Документация разработчика Android, как часть Project Svelte (девиз: "Вы когда-нибудь пытались установить Bugdroid в тощие джинсы?!?" ), есть страница на Управление памятью приложений. Он содержит:

Когда пользователь переходит к другому приложению, и ваш интерфейс больше не отображается, вы должны освободить любые ресурсы, которые используются только вашим пользовательским интерфейсом. Освобождение ресурсов пользовательского интерфейса в это время может значительно увеличить пропускную способность системы для кешированных процессов, что напрямую влияет на качество работы пользователя.

и

TRIM_MEMORY_RUNNING_LOW: ваше приложение работает и не считается гибким, но устройство работает значительно ниже в памяти, поэтому вы должны освобождать неиспользуемые ресурсы для повышения производительности системы (что напрямую влияет на производительность вашего приложения).

и т.п.

Однако это имело бы смысл, если бы "освобождение ресурсов" фактически повлияло бы на системную RAM.

У меня создалось впечатление, что Dalvik VM ведет себя так же, как Java VM (или, возможно, "сделал", если они изменили его, когда я не смотрел). AFAIK, Java VM выделяет системную RAM для увеличения размера кучи, но никогда не выпускает ее - после выделения она остается частью пространства кучи до тех пор, пока выполняется процесс.

Если Dalvik VM ведет себя одинаково, тогда я не вижу, как увеличение объема нераспределенного пространства кучи в нашем процессе окажет какое-то влияние на общую производительность системы. Теперь освобождение кучи пространства для нашего процесса - это хорошо, и, возможно, это снизит вероятность того, что нам понадобится больше оперативной памяти в будущем... но это не то, что подразумевает документация. В документации указано: "Освобождение ресурсов пользовательского интерфейса в это время может значительно увеличить пропускную способность системы для кешированных процессов"; он не говорит, что "Освобождение ресурсов пользовательского интерфейса в это время не оказывает немедленного воздействия, но поможет сократить объем занимаемой памяти операционных систем в будущем".

Теперь, если бы инструкции сказали нам освободить память, выделенную через NDK, это будет иметь смысл, поскольку это происходит за пределами кучи Dalvik и повлияет на оперативную память системы. Но документация не делает этого различия.

Действительно ли Dalvik VM освобождает выделенную RAM обратно в систему, кроме как завершая процесс? Если да, то когда? И, в меньшей степени, как это делается, учитывая, что сборщик мусора не уплотняет и не копирует?

Спасибо!

4b9b3361

Ответ 1

Да. Основная идея заключается в том, что если на странице 4K нет ничего, страница будет возвращена в систему.

Функция, которая делает это в VM, называется trimHeaps(), в dalvik/vm/alloc/HeapSource.cpp. Вы можете увидеть его с помощью mspace_trim(), который использует вызовы ОС, чтобы отменить куски, которые больше не нужны (см. Комментарии malloc_trim() вокруг строки 1203 в malloc.c). Затем он перемещает кучу с помощью mspace_inspect_all(), которая вызывает в releasePagesInRange() для каждой области. Тест обратного вызова, чтобы проверить, был ли он передан регион без каких-либо ассигнований в нем, и если это так, обрезает границы с выравниванием 4K. Если результат не пуст, мы знаем, что область охватывает одну или несколько физических страниц 4K, которые могут быть возвращены в систему с помощью madvise(MADV_DONTNEED).

trimHeaps() вызывается из нескольких мест, наиболее заметно gcDaemonThread(), который инициирует обрезку через пять секунд после параллельного GC. Таймер получает reset, если параллельный GC происходит до истечения пяти секунд, идея состоит в том, что если мы GCing, тогда VM активно распределяет, и эта сортировка времени простоя будет контрпродуктивной.

Потому что Dalvik GC не делает уплотнения, это не так эффективно, как могло бы быть. Фрагментация имеет тенденцию нарастать с течением времени, так что ситуация может ухудшиться, чем дольше процесс жизни. Рамки приложений могут "перерабатывать" долгоживущие сервисы, чтобы облегчить это.