Документация разработчика Android, как часть Project Svelte (девиз: "Вы когда-нибудь пытались установить Bugdroid в тощие джинсы?!?" ), есть страница на Управление памятью приложений. Он содержит:
Когда пользователь переходит к другому приложению, и ваш интерфейс больше не отображается, вы должны освободить любые ресурсы, которые используются только вашим пользовательским интерфейсом. Освобождение ресурсов пользовательского интерфейса в это время может значительно увеличить пропускную способность системы для кешированных процессов, что напрямую влияет на качество работы пользователя.
и
TRIM_MEMORY_RUNNING_LOW
: ваше приложение работает и не считается гибким, но устройство работает значительно ниже в памяти, поэтому вы должны освобождать неиспользуемые ресурсы для повышения производительности системы (что напрямую влияет на производительность вашего приложения).
и т.п.
Однако это имело бы смысл, если бы "освобождение ресурсов" фактически повлияло бы на системную RAM.
У меня создалось впечатление, что Dalvik VM ведет себя так же, как Java VM (или, возможно, "сделал", если они изменили его, когда я не смотрел). AFAIK, Java VM выделяет системную RAM для увеличения размера кучи, но никогда не выпускает ее - после выделения она остается частью пространства кучи до тех пор, пока выполняется процесс.
Если Dalvik VM ведет себя одинаково, тогда я не вижу, как увеличение объема нераспределенного пространства кучи в нашем процессе окажет какое-то влияние на общую производительность системы. Теперь освобождение кучи пространства для нашего процесса - это хорошо, и, возможно, это снизит вероятность того, что нам понадобится больше оперативной памяти в будущем... но это не то, что подразумевает документация. В документации указано: "Освобождение ресурсов пользовательского интерфейса в это время может значительно увеличить пропускную способность системы для кешированных процессов"; он не говорит, что "Освобождение ресурсов пользовательского интерфейса в это время не оказывает немедленного воздействия, но поможет сократить объем занимаемой памяти операционных систем в будущем".
Теперь, если бы инструкции сказали нам освободить память, выделенную через NDK, это будет иметь смысл, поскольку это происходит за пределами кучи Dalvik и повлияет на оперативную память системы. Но документация не делает этого различия.
Действительно ли Dalvik VM освобождает выделенную RAM обратно в систему, кроме как завершая процесс? Если да, то когда? И, в меньшей степени, как это делается, учитывая, что сборщик мусора не уплотняет и не копирует?
Спасибо!