В android мы можем перехватить событие low memory для нашего приложения или активити, путем установки им через registerComponentCallbacks в качестве обрабочика наследника от интерфейса ComponentCallbacks переопределив ему метод onLowMemory.
Подразумевается, что в данном обработчике мы можем при наступление события low memory должны освободить не критичные ресурсы, почистить внутренний кэш и другими методами уменьшить количество используемой памяти, тем самым избежав того что наш процесс закроют.
Так же система гарантирует что после вызова onLowMemory будет вызвана системная сборка мусора (garbage collector)
И так, если наше приложение реализует какое либо поведение при наступлении данного события — хорошо бы протестировать это поведение.
Стандартный способ простой — начинаем искуственно увеличивать количество потребляемых ресурсов (например загружать картинки по два раза) пока не упремся в лимит.
И есть и второй способ — изменить данный лимит, о чем собственно и речь пойдет ниже.
К сожалению данный способ будет работать только на рутованных устройствах.
И так, планировщик задач в android делит запущенные приложения на 6 следующих типов:
Для каждого из этих типов приложения есть лимит памяти при котором, если памяти остаеться меньше данного лимита, планировщик начинает убивать неиспользуемые с его точки зрения приложения данного типа.
Данные лимиты можно посмотреть следующим образом
Для Samsung Galaxy Nexus значения будут следующие
Значения измеряются в страницах памяти, каждая страница равна 4 килобайтам.
Если у вас рутованный телефон, вы можете менять эти значения произвольным образом в реальном времени, простой командой
При перезагрузке устройства значения востанавливаются.
И так, изменяя данные значения в рантайме вы можете легко добиться вызова вашего обработчика onLowMemory, и так же потенциально протестировать поведение приложения на других устройствах, на которых данные значения другие (хотя это и не заменит полноценного тестирования на самом устройстве конечно).
Подразумевается, что в данном обработчике мы можем при наступление события low memory должны освободить не критичные ресурсы, почистить внутренний кэш и другими методами уменьшить количество используемой памяти, тем самым избежав того что наш процесс закроют.
Так же система гарантирует что после вызова onLowMemory будет вызвана системная сборка мусора (garbage collector)
И так, если наше приложение реализует какое либо поведение при наступлении данного события — хорошо бы протестировать это поведение.
Стандартный способ простой — начинаем искуственно увеличивать количество потребляемых ресурсов (например загружать картинки по два раза) пока не упремся в лимит.
И есть и второй способ — изменить данный лимит, о чем собственно и речь пойдет ниже.
К сожалению данный способ будет работать только на рутованных устройствах.
И так, планировщик задач в android делит запущенные приложения на 6 следующих типов:
FOREGROUND_APP:
// This is the process running the current foreground app. We'd really
// rather not kill it! Value set in system/rootdir/init.rc on startup.
VISIBLE_APP:
// This is a process only hosting activities that are visible to the
// user, so we'd prefer they don't disappear. Value set in
// system/rootdir/init.rc on startup.
SECONDARY_SERVER:
// This is a process holding a secondary server -- killing it will not
// have much of an impact as far as the user is concerned. Value set in
// system/rootdir/init.rc on startup.
HIDDEN_APP:
// This is a process only hosting activities that are not visible,
// so it can be killed without any disruption. Value set in
// system/rootdir/init.rc on startup.
CONTENT_PROVIDER:
// This is a process with a content provider that does not have any clients
// attached to it. If it did have any clients, its adjustment would be the
// one for the highest-priority of those processes.
EMPTY_APP:
// This is a process without anything currently running in it. Definitely
// the first to go! Value set in system/rootdir/init.rc on startup.
// This value is initalized in the constructor, careful when refering to
// this static variable externally.
Для каждого из этих типов приложения есть лимит памяти при котором, если памяти остаеться меньше данного лимита, планировщик начинает убивать неиспользуемые с его точки зрения приложения данного типа.
Данные лимиты можно посмотреть следующим образом
adb shell cat /sys/module/lowmemorykiller/parameters/minfree
Для Samsung Galaxy Nexus значения будут следующие
7469,9396,11324,13372,15299,19034
Значения измеряются в страницах памяти, каждая страница равна 4 килобайтам.
Если у вас рутованный телефон, вы можете менять эти значения произвольным образом в реальном времени, простой командой
echo "1536,2048,4096,5120,15360,23040" > /sys/module/lowmemorykiller/parameters/minfree
При перезагрузке устройства значения востанавливаются.
И так, изменяя данные значения в рантайме вы можете легко добиться вызова вашего обработчика onLowMemory, и так же потенциально протестировать поведение приложения на других устройствах, на которых данные значения другие (хотя это и не заменит полноценного тестирования на самом устройстве конечно).