Как принудительно перевести память приостановленного процесса в своп?

Я ищу способы улучшить пользовательский интерфейс для устройств Android с 256 МБ памяти. Память настолько ограничена, что большие внешние приложения вызывают множество замен для других приложений.

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

Чтобы уменьшить задержку при выгрузке памяти других приложений, я хочу, чтобы память приостановленных приложений могла быть проактивно заменена на диск/флэш-память, чтобы оперативная память могла быть мгновенно освобождена в соответствии с потребностями внешнего приложения. (эталонная скорость: SDHC класса 10: запись 10 МБ/с, поэтому браузер отстает на 2 секунды, если веб-странице требуется 20 МБ ОЗУ)

Итак, мой вопрос: как заставить систему поменять частную память приостановленного процесса на диск / флэш-память?


person Ligon Liu    schedule 27.05.2012    source источник


Ответы (2)


Неактивный процесс автоматически уходит в своп, если требуется ram, т.к. у него более низкий приоритет (см. приоритеты на андроиде).

Теоретически карта класса 10 хороша и может сделать своп только за 2 секунды, но контроллер памяти карты такой длинный, что у вас будет 5 или 6 секунд. Иметь больше, чем класс 6, бесполезно.

person aurelien    schedule 14.08.2012
comment
Такой механизм позаимствован у iOS. Проблема с этим подходом заключается в следующем: пользовательский опыт одного приложения зависит от других приложений. Представьте, что пользователь запускает какое-то другое приложение B, когда ваше приложение A получает уведомление. Пользователь хочет переключиться на A, но A ожидает завершения onPause() B, прежде чем сможет что-то сделать. Я не думаю, что средний, нетехнический пользователь может понять, что здесь происходит, кроме того, что приложение А загружается медленно. Я знаю, что в Windows и Linux это тоже происходит, но в Win/Lin ОБА приложения работают медленно, а не только жертва открывается медленно. - person Ligon Liu; 15.08.2012

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

Из документации для разработчиков Android — Управление жизненным циклом активности:

Если действие приостановлено или остановлено, система может удалить его из памяти, либо попросив его завершить (вызвав его метод finish()), либо просто уничтожив его процесс. Когда активность открывается снова (после завершения или уничтожения), она должна быть создана заново.

onPause() действия — это последний из обратных вызовов жизненного цикла, который гарантированно запускается, позволяя ему сохранять свое состояние, после чего Android может счастливо сбрасывать его по своему усмотрению.

Из далее в том же документе:

... если система должна восстановить память в чрезвычайной ситуации, то onStop() и onDestroy() могут не вызываться. Следовательно, вы должны использовать onPause() для записи важных постоянных данных (например, пользовательских изменений) в хранилище. Однако вам следует выбирать, какая информация должна сохраняться во время onPause(), потому что любые блокирующие процедуры в этом методе блокируют переход к следующему действию и замедляют работу пользователя.

(выделение добавлено)

Таким образом, узкое место, с которым вы можете столкнуться, скорее всего, связано с самими приложениями, а не с ОС, и сохранение состояния Activity все же, вероятно, будет намного быстрее, чем попытка сохранить содержимое памяти всего приложения.

person Chilledrat    schedule 15.08.2012