Настройка Low Memory Killer в Android 4.X для оптимального автоматического освобождения памяти

Официальные системные требования Android 4.X — это процессор на 1 ГГц и 1 Гб оперативной памяти.

И никакого запаса по памяти или частотам здесь нет, это край, ниже которого начинаются тормоза. Не из-за кривости чьих бы то ни было рук, а по причине функциональности ОС, которая с выходом Ice Cream Sandwitch действительно серьезно возросла (ну или можно все свалить на Java).

Только что загруженная операционная система занимает около 350 Мб, за вычетом кода ядра и невыгружаемых компонентов на девайсе с 512 Мб памяти свободными остаются около 120 Мб. Среднее современное приложение вроде Twitter или Instagram во время своей работы может сожрать до 50 Мб.

Да, тебе не нужна одновременная работа нескольких программ, однако Android — это не Windows, он не завершает работу приложения при его закрытии, а всего лишь сворачивает, в результате чего софт продолжает жрать память, даже когда ты им не пользуешься. Чтобы ось не сдохла от нехватки памяти, в критические моменты просыпается процесс, названный Low Memory Killer, и беспощадно убивает фоновые приложения.

Low Memory Killer очень важный инструмент. Это не просто топорная прибивалка софта, а интеллектуальный механизм, который можно перенастроить под любые нужды. Алгоритм работы этого внутриядерного процесса основан на значениях «важности», которые присваиваются каждому работающему в системе приложению и могут изменяться во времени. Всего таких значений шесть:
  • FOREGROUND_APP — видимое на экране приложение, его убивать нельзя ни в коем случае;
  • VISIBLE_APP — работающий в фоне процесс, отвечающий за вывод той или иной информации на экран (иконка в строке состояния, выдвижная панель, виджет и так далее), его лучше тоже не убивать;
  • SECONDARY_SERVER — фоновый сервис, такой как музыкальный проигрыватель, будильник, синхронизация данных, обычно может быть убит без серьезных последствий для системы в целом, но с потерей функциональности;
  • HIDDEN_APP — работающее в фоне приложение, может быть убито в любой момент, но это скажется на его функциональности;
  • CONTENT_PROVIDER — фоновый сервис, отвечающий за хранение и предоставление какой-либо информации (настройки, фотографии, что угодно), но в данный момент простаивающий (клиентов нет), может быть безболезненно убит;
  • EMPTY_APP — любой фоновый процесс (приложение), который ничего не делает, первый кандидат на убийство.

Важность приложений каждой группы растет снизу вверх. То есть при нехватке памяти Low Memory Killer начнет убийство с последней группы и, если памяти снова будет не хватать, будет продвигаться выше. Само понятие «дефицит памяти» у Low Memory Killer определяется шестью порогами, по одному на каждую группу процессов. На всех смартфонах (и прошивках) значения этих порогов разные, например, на Motorola Defy с CM-10.2 на борту они такие:
  • FOREGROUND_APP: 25 Мб
  • VISIBLE_APP: 30 Мб
  • SECONDARY_SERVER: 40 Мб
  • HIDDEN_APP: 50 Мб
  • CONTENT_PROVIDER: 55 Мб
  • EMPTY_APP: 70 Мб

Свободной памяти меньше 70 Мб — убиваются безработные фоновые приложения, меньше 55 Мб — в расход пойдут Content Porovider’ы и так далее. Когда памяти останется всего 25 Мб, будет убито используемое в данный момент приложение, но вероятность такого исхода крайне мала; после убийства всех остальных приложений память занимать будет просто некому.

Красота всего этого механизма в том, что он может быть перенастроен в любой момент. В Android есть файл /sys/module/lowmemorykiller/parameters/minfree, который можно прочитать, чтобы получить текущие значения порогов или записать в него новые значения (через запятую в 4-килобайтных блоках), которые вступят в силу сразу после записи. То же самое можно сделать, используя приложение Auto Memory Manager, MinFree и аналоги.

Какие значения будут подходящими? Здесь все зависит от способа использования смартфона. Если аппарат тебе нужен только для того, чтобы звонить, читать почту и твиттер, значения лучше либо оставить как есть, либо убавить (но не рекомендую ставить ниже 50 Мб). Тогда система будет освобождать память только в крайнем случае, и все приложения, которыми ты часто пользуешься, останутся в памяти и будут запускаться мгновенно.

Если же ты привык использовать смартфон для запуска большого количества самых разных приложений и игр, то значения лучше повысить (в Auto Memory Manager это можно сделать за один тап, нажав кнопку Aggressive). Тогда в системе всегда будет оставаться достаточно памяти для запуска сразу нескольких тяжелых приложений, и она не будет тратить время на освобождение оперативки.

Еще один радикальный вариант — это повысить лимиты двух последних групп до максимума, в результате чего Android фактически превратится в однозадачную систему, каковой до недавнего времени была iOS и до сих пор остается Windows Phone (условно, конечно). Другими словами, система будет автоматически убивать приложения сразу после их закрытия, но только в том случае, если софтина не будет в этот момент ничего делать. Системные компоненты при этом останутся висеть в памяти.