Разбираемся в механизме взаимодействия с памятью и в причинах вылетов приложений на Android. Лечим эту проблему множеством способов.
Основная причина вылетов в большинстве случаев — нехватка ОЗУ. Разберемся с тем, как работает оперативная память на устройствах Android и попробуем устранить вылеты. Также рассмотрим прочие нюансы, которые могут провоцировать данную проблему.
Словом «вылет» принято называть вынужденное прекращение работы запущенной программы (или игры) на смартфоне/планшете под управлением операционной системы Android. В подавляющем большинстве случаев это связано с нехваткой оперативной памяти (также, ОЗУ или RAM), в которую и загружаются все данные приложений, запущенных на устройстве в данный момент времени. Когда оперативной памяти не хватает для записи новой информации, система Android в принудительном порядке закрывает запущенные процессы для ее освобождения.
Приложение Google остановлено! Обсудим Android в 2021 году!
Чтобы более четко разобраться в причине вылетов программ на Android, нужно понять то, как работает это все изнутри. Для начала рассмотрим то, как система управляет оперативной памятью и почему иногда ее не хватает. Это также поможет нам ответить на вопрос, как исправить вылеты.
Что такое ОЗУ в Android и как влияет на вылеты
Стоит отметить, что операционная система Android построена на базе ядра Linux. Каждый раз, когда мы запускаем ту или иную программу (или игру) на нашем устройстве, создается специальный процесс этого приложения внутри ядра. Он необходим для того, чтобы определить, какое количество ресурсов будет «передано» запущенному приложению: сколько оперативной памяти нужно выделить, какая процессорная мощность требуется, какие сетевые запросы нужно сделать, операции I/O (что нужно записать в постоянную память или «достать» оттуда) и прочее.
Проще говоря, любое запущенное приложение – это созданный процесс в системе, который просит у Android определенное количество различных аппаратных ресурсов.
А что произойдет, если процесс потребует количество оперативной памяти, которое система не сможет ему предоставить? Ведь в случае с процессорной мощностью, если программе потребуется то или иное количество ресурсов CPU, она получит их в 100% случаев, так как ресурс процессора – это, условно говоря, бесконечная величина. Любая задача будет выполнена процессором, вопрос заключается только во времени.
Но количество оперативной памяти, как мы знаем, строго ограничено. В такие моменты и происходит «вылет» – программа потребовала столько памяти, сколько система не может ей предоставить, а значит дальнейшее выполнение этого процесса невозможно.
Если еще проще, то каждое нажатие на иконку приложения запускает его процесс, который обращается к ядру примерно с таким вопросом: “Мне нужно вот столько … ОЗУ, чтобы я хотя бы смог загрузиться и показать пользователю главное меню”. И впоследствии, если нужно больше ОЗУ, процесс снова обращается к ядру: “Мне нужно еще столько … памяти для загрузки этих файлов, этих и …”.
ВЫЛЕТАЮТ ПРИЛОЖЕНИЯ НА ТЕЛЕФОНЕ ANDROID? БЫСТРОЕ РЕШЕНИЕ
В зависимости от того, о каком приложении идет речь, требуется разное количество оперативной памяти под его нужды. Например, если мы запускаем какую-нибудь «тяжелую» и увесистую игру с 3D-графикой, то она будет требовать в разы больше этой самой памяти, чем какой-нибудь мессенджер или браузер. Это происходит потому, что такие игры слишком нагружают процессор и графическое ядро. Каждый элемент в текстурах (машины, оружие и прочее) фактически должен где-то храниться в памяти для дальнейшей работы с ним. И хранится все это именно в оперативной памяти, которую используют приложения, запущенные в данный момент.
Благо в нашей системе есть специальные службы, которые занимаются очисткой оперативной памяти, то есть, ее освобождением. Когда мы закрываем программу, происходит «убийство» ее процесса – он просто выгружается из памяти и освобождает ту ее часть, которая ранее была занята. Освободившаяся память попадает в так называемый пул «Free Memory», откуда ядро и будет черпать заветные мегабайты для других запускаемых приложений. В переводе это означает “Свободная память”.
Но у системы есть и другой пул, который имеет название «Available Memory», что в переводе – “Доступная память”. Казалось бы, одно и то же. В чем разница?
Что такое доступная и свободная память
Вообще, операционной системе не выгодно держать большое количество памяти в качестве свободной, то есть в пуле «Free Memory». Почему? Все просто. Android представляет собой настолько большой механизм, что любую свободную память можно куда-нибудь «запихать». Например, отдать системному ядру на выполнение каких-либо жизненно необходимых для работы устройства задач или отдать в распоряжение программам, которые уже запущены.
Логика заключается в том, что в любой момент в будущем той или иной программе может потребоваться больше памяти и чтобы она не делала запрос в ядро, затрачивая время, ей выделяют «лишнюю» память, которая сейчас ей не нужна, но может пригодиться. Это и называется доступной памятью, которая хранится в пуле «Available Memory». В любой момент она может перестать играть роль «спасательного круга» или запасного варианта, будучи задействованной напрямую.
Встроенные методы высвобождения ОЗУ
По причине, которая уже описана выше, ядро Android использует настолько большое количество памяти, насколько только может. И пока доступной памяти у системы хватает, она может «разбрасываться» ею совершенно спокойно. Но обязательно приходит время, когда ресурсов уже недостаточно даже для запуска программы. Откуда тогда взять память? Есть несколько вариантов:
- Прекратить работу какого-либо процесса (приложения).
- Применить технологию ZRAM.
- Использовать файл подкачки – SWAP (память, которая «преобразуется» из постоянного хранилища, например, на карте памяти и используется как оперативная).
О файле подкачки, кстати, мы еще будем говорить далее, когда дойдет дело до рекомендаций.
Первый вариант означает то, что ядро просто «убивает» процесс программы, которая была запущена ранее, чтобы освободить место в ОЗУ под данные для новой программы. Например, мы запустили 5 приложений в таком порядке (важно запомнить): WhatsApp, Viber, Facebook, Gmail, Subway Surfers и хотим открыть YouTube, но ресурсов больше нет. Что произойдет?
Система посмотрит на процессы, которые уже запущены и завершит работу WhatsApp, так как он запускался раньше всех (использовался нами давно, в сравнении с Gmail и остальными). Причем ядру абсолютно безразлично то, нужен ли нам еще WhatsApp или нет. Такова цена вопроса.
Второй вариант с ZRAM более щадящий. Суть заключается в том, что для выделения определенного объема памяти под процесс ядро обращается к той части памяти, которая уже занята и сжимает ее, создавая что-то наподобие архива. Далее этот архив помещается во внутреннюю память (на жесткий диск) и хранится там до тех пор, пока эти данные не понадобятся снова. Если рассмотреть ситуацию с 5 приложениями выше по аналогии, то произойдет что-то вроде этого:
- Определение как «жертвы» программы WhatsApp, которая запускалась давно.
- Поиск фрагментов памяти, выделенных под «WhatsApp», которые используются редко.
- Архивирование (сжатие) этих фрагментов и запись их на жесткий накопитель (ROM).
Таким образом память высвобождается под новое приложение. Но, чтобы получить доступ к «WhatsApp» вновь, системе уже нужно считать записанный в накопителе архив и разархивировать его. Все это требует времени (в эти моменты, кстати, и случаются различные подтормаживания системы при переключении между программами), поэтому ZRAM тоже не самая идеальная технология.
Ручные методы освобождения ОЗУ
На самом деле то большое количество программ для очистки ОЗУ, которое есть в магазине Google Play практически бесполезно. И это несмотря на то, как порой усердно разработчики этих утилит пытаются убедить нас в том, что именно их утилита решит все наши проблемы с нехваткой оперативки. Данный софт не то чтобы сложно назвать эффективным, его даже тяжело назвать безопасным для системы, так как появляются вопросы лишь о его вреде.
Как мы уже говорили ранее, Android изначально имеет несколько способов управления оперативной памятью, которые существовали много лет назад. А сейчас, новые сборки Android 10 и 11 могут похвастаться все более совершенными механизмами. Система сама ведет учет памяти и расставляет приоритеты в том, какие программы нужно закрыть для выделения ресурсов. Поэтому установка какого-либо софта, очищающего ОЗУ – бесполезная инициатива.