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

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

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

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

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

2 ответа

Неактивный процесс выполняется автоматически в режиме подкачки, если требуется оперативная память, поскольку он имеет более низкий приоритет (см. Приоритеты на Android).

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам