Управление местом в приложении на андроид что это
У каждого разработчика наступает момент, когда ему кажется, что он освоил язык программирования, но приложение тормозит и отладчик не помогает. Это значит, что ему нужно расширять круг своих познаний, выйти из привычной среды разработки и оценить происходящее извне.
Начните управлять памятью. Да, это сложно поначалу, но память компьютера и мобильного девайса — ресурс ограниченный, и научившись им распоряжаться, удается одним махом решить целый спектр проблем.
Управление памятью в Android
Каждое приложение Android работает в виде отдельного процесса в рамках виртуальной машины Dalvik, исполняющей приложения, написанные на Java.
Dalvik оптимизирована для низкого потребления памяти, но расплата за это — нестандартная регистр-ориентированная архитектура, подходящая для исполнения на RISC-архитектурах мобильных процессоров. Это в корне отличает её от стандартных виртуальных машин Java. В Android 4.4 Kitkat и выше есть выбор между Dalvik и более быстрым ART, а в Android 5.0 используется только ART.
И Dalvik, и ART — надстройки над ядром Linux, а ведь именно он отвечает за работу с «железом» и памятью на низком уровне. А всем остальным приложениям предоставляется API, что не одно и тоже, что и прямой доступ к ресурсам и приводит к замедлению работы ПО.
Разработчик должен помнить об особенностях управления жизненным циклом ПО в Android: поскольку оперативная память ограничена и есть приоритеты в ее использовании, то порой запуск одного приложения означает закрытие другого из-за недостатка памяти с сохранением состояния в ПЗУ. И чем больше приложений запущено, тем чаще станут эти переключения и будет больше время закрытия/восстановления. И каков бы не был чудесен код этого приложения — оно будет подтормаживать.
Утечки памяти и контекст
Типичная ошибка новичков: наставить кучу долгоживущих ссылок на контекст. Вспоминаем: контекст(Context) используется для загрузки и доступа к ресурсам. Эта та самая причина, по который виджеты должны получать параметр Context в конструктор.
Приложения имеют два вида контекста: Activity and Application. Первый — экран с пользовательским интерфейсом, на который держат ссылку в коде и тем самым не дают сборщику мусора удалить отработавший код и данные. Сколько при этом будет потеряно памяти — неизвестно.
А теперь представьте: меняется ориентация экрана, и система по умолчанию уничтожает текущую активность и создает новую с сохранением состояния. Также должен перезагрузиться пользовательский интерфейс приложения. А если в нем содержится большое растровое изображение? Надо принимать меры! Например, использовать статические поля. Но ведь о них не помнят, пока не возьмут в руки девайс со своим приложением!
Правильное использование контекста Application поможет с проблемами: он «жив», пока работает приложение и не зависит от жизненного цикла. Если разработчику нужны долгоживущие объекты, нуждающиеся в контексте, вспомните об Application: Context.getApplicationContext() или Activity.getApplication().
Перечисленными приемами, конечно же, не ограничиваются методики управления памятью. Главное — сборщик мусора должен делать свою работу, а программист не мешать ему работать. Управлять памятью надо в момент написания кода, а не тогда, когда приложение уже запущено! Кроме того, надо помнить об «узких» местах работы с памятью, свойственных архитектуре Android.
Мы же продолжим эту тему и поговорим о том, какие профайлеры в среде разработки или статические анализаторы кода могут помочь.
Тем, кто хочет профессионально разрабатывать под Android, рекомендуем профессию «Разработчик Android».
Заметили, что на вашем смартфоне почти не осталось памяти? Возможно, вы не отключили несколько опций, а возможно, это необратимый процесс. Лайф разобрался, как очистить память в смартфоне.
Мессенджеры и приложения сохраняют файлы сами по себе
В ряде приложений, которыми мы часто пользуемся, включена автоматическая загрузка файлов. WhatsApp сохраняет все фото и видео, которые вам присылают собеседники, Instagram — снимки с фирменными фильтрами. Через год одна из таких "папочек" вполне может заполнить 10–15 гигабайт.
В каждом приложении сохранение файлов можно отключить. Наиболее гибкие настройки сохранения кэша — в WhatsApp. Зайдите в "Настройки" —> "Данные и хранилище". Вы увидите раздел "Автозагрузка медиа" и сможете управлять сохранением файлов — они могут вообще не перемещаться в память телефона или сохраняться, но только при подключённом Wi-Fi.
Как определить, что мобильное приложение шпионит за вами. Оно совершает эти 6 действий
Чтобы удалить загруженные данные, зайдите в диспетчер файлов или просто приложение "Файлы" (название зависит от прошивки смартфона). Как правило, в нём есть отдельная папка конкретного приложения. И удалите все ненужные данные.
Слишком много кеша
Приложения собирают мелкие данные, чтобы работать быстрее, не тратить лишний трафик и не скачивать их из Интернета каждый раз. Фотографии пользователей в соцсетях, их аватары, записи и даже рекламные баннеры. Много места они не "съедят", но вполне могут занять несколько сотен мегабайт.
Почти каждое приложение браузера, соцсети или мобильной игры позволяет контролировать сохранение кеша. Сбросить его можно в настройках программы, как правило, в разделе памяти и сохранённых файлов.
Фото и видео сильнее других данных заполняют память смартфона. Более того, часть фотографий — это рандомные скриншоты. В смартфонах последних двух лет снимок экрана делается при одновременном нажатии на качельку регулировки громкости и кнопки питания.
К сожалению, решение проблеме ещё не нашли — на iPhone без рамок это единственный способ сделать скриншот, производители Android-смартфонов предлагают альтернативную команду — свайп тремя пальцами вниз, но отключить снимок экрана по одновременному нажатию качельки и кнопки питания нельзя.
Поэтому единственный способ не забивать память — стабильно чистить галерею. Кроме того, фотографии можно хранить в "Google фото" — снимки сохранятся, окажутся доступны с разных устройств и не будут занимать пространство на накопителе.
Настройки -> Основные -> Хранилище iPhone. Вы увидите раздел "Другое", и файлы, хранящиеся в нём, также забивают память. Они могут занимать до 80% памяти вашего смартфона в зависимости от продолжительности пользования.
Проблема в том, что файлы из этой папки бесполезные, а удалить их невозможно. Грубо говоря, это хлам, который iOS накапливает во время работы.
Удалить его можно только одним способом — полностью обновив прошивку на iPhone. Беда в том, что после этой операции восстановить резервную копию невозможно. Стоит ли жертвовать всеми данными ради свободного места на накопителе? Подумайте, прежде чем решиться на эту процедуру.
Telegram хотят разблокировать, но смысл? Одна функция "Яндекс.Мессенджера" убивает его и WhatsApp
Более безопасное решение — выгрузить все необходимые данные в облако и загрузить обратно вручную. Это займёт больше времени, но вы освободите заветные гигабайты.
Эта опция есть не во всех смартфонах, зависит от прошивки. Когда вы удаляете файлы, они не стираются безвозвратно, а попадают в корзину и удаляются только спустя определённое время — в iOS через 30 дней, в Samsung One UI — спустя 15 дней.
Плюс этой опции — надёжность системы. Если вы случайно удалили файл, останется время, чтобы его восстановить. Минус — когда надо срочно освободить память, придётся удалить файлов и приложений больше, чем если бы функция "Корзина" была отключена.
Некоторые пользователи даже устанавливают приложения-убийцы или другие приложения для управления оперативной памятью, чтобы освободить место для хранения данных. Но действительно ли есть смысл в ручном управлении RAM-памятью на Android-девайсах?
Что такое RAM
В смартфоне, как и в любом ПК, есть несколько видов памяти. Они работают с разной скоростью и стоят также по-разному. К примеру, внутренняя память
относительно медлительна, недорога и может сохранять информацию даже при отключении источника питания. Именно во внутренней памяти хранятся приложения, их данные, а равно фото и видео. Оперативная память стоит дороже внутренней, но зато намного быстрее ее. При отключении питания информация в такой памяти не сохраняется. RAM-память является как бы рабочей оболочкой для ваших приложений, где хранятся временные данные, необходимые для использования вашего телефона.
Память заполнена: причина для паники?
Через некоторое время внутренняя память вашего телефона заполняется приложениями, которые вы используете чаще всего. В такой ситуации эта память должна быть частично очищена, чтобы была возможность открывать новые приложения. Однако вам ничего не нужно делать самому – за вас все сделает Android в автоматическом режиме.
Представление о том, что RAM-память внутри Android-девайса нужно очищать вручную, является не совсем верным. Если «оперативка» будет пустой, то вам придется постоянно перезапускать приложения, а это лишняя трата времени, ресурсов телефона и сокращение времени работы аккумулятора.
Полная RAM-память – это не слишком плохо, можно даже сказать, хорошо. Так как Android имеет свои корни в Linux и Unix, системное ядро Linux определяет правила для управления памятью. И такие правила следуют концепции, что свободная внутренняя память – это потерянная память.
Если вы включите смартфон и загрузите несколько приложений, то все эти приложения останутся в памяти. Если вы используете какое-то приложение, вы можете переключиться на главных экран и затем снова вернуться к этому приложению, и оно будет загружаться почти мгновенно. Это связано с тем, что приложение в той или иной форме остается во внутренней памяти.
Но если на вашем девайсе есть приложение-убийца или функция экономии памяти, которая постоянно закрывает процессы фонового режима, вам придется долго ждать, пока загрузятся такие приложения, как скажем, Facebook или Whatsapp. Подобный способ управления RAM-памятью может даже нанести вред производительным смартфонам, например, Samsung Galaxy S7.
Очистка оперативной памяти на Android-устройстве: когда ее нужно делать?
Есть мнение, что многие производители смартфонов оснащают свои девайсы функциями «очистки» для существующих приложений, и в этом слухе может быть какая-то доля правды. Хотя в действительности закрытие того или иного приложения для экономии места в RAM-памяти имеет смысл лишь в отдельных случаях.
Как правило, не рекомендуется прекращать работу приложения или очищать всю память. Тем не менее, бывает ситуация, которая требует прямого действия: когда приложение дает сбой или работает некорректно. Например, это может быть браузер, который работает с подтормаживанием или в котором присутствуют ошибки отображения информации. Либо это могут быт проблемы с загрузкой Facebook или Twitter. Такие симптомы могут быть весьма разнообразными. Даже перегрев смартфона без очевидной причины может быть связан с приложением, давшем сбой.
Только в подобных случаях есть смысл остановить работу поврежденного приложения. Иногда бывает достаточно убрать приложение из вида в режиме многозадачности, хотя это, по сути, эффект плацебо, так как мы лишь убираем приложение из обзора приложений, но не останавливаем его работу.
Как отобразить использование RAM-памяти и закрыть Android-приложения
Если сокрытие приложения не помогает, то вам может потребоваться более радикальный подход – закрыть приложение вручную. Это можно сделать в настройках. Здесь вы также можете посмотреть, какие приложения используют оперативную память больше всего, и какие приложения можно удалить в будущем.
Итак, чтобы отобразить объем используемой «оперативки», войдите в настройки вашего телефона, найдите меню приложений и откройте вкладку «Работающие». Начиная с версии Android Marshmallow, это представление имеет собственную запись в разделе «Память» в главных настройках.
Здесь вы увидите статистику использования памяти за последнее время. В зависимости от смартфона, подробный обзор может быть сокрыт за каким-либо дополнительным меню. Чтобы действительно закрыть приложение, вам необходимо перейти к информации о приложении. Как правило, сделать это можно, выбрав нужное приложение в перечне приложений. Здесь вы увидите иконку для того, чтобы остановить приложение. Впоследствии бывает так, что отключенное приложение снова запускается, но причина этого почти всегда заключается в тех или иных действиях пользователя.
Нажатие на отдельные приложения определит, какие из них потребляют большую часть системной памяти. Перезапуск смартфона может помочь в случае, если проблема не устранена.
Очистка RAM-памяти: удаление приложений, «съедающих» память
Приведенный выше список показывает, сколько памяти требуется приложениям. Эта цифра может также указывать на то, что для приложения требуется слишком много ресурсов. Помимо прочего, вы можете удалить приложения, которые не использовали длительное время, или те, которые выглядят подозрительно.
Войдите в меню настроек приложения или менеджера приложений и найдите соответствующее приложение. Теперь просто удалите приложение, если это возможно. Если это не сработает, вам необходимо удалить «расширенные права» приложения. Обычно вы предоставляете такие права приложению во время его установки на телефон. Откройте основные настройки, выберите раздел «Безопасность», затем «Администраторы устройства» и удалите крестик рядом с приложением. Теперь вы можете удалить приложение.
Заключение
Итак, нужно ли вам делать чистку внутренней памяти? Ответ прост – нет! Вам нужно лишь принять меры тогда, когда ваш телефон станет работать медленнее. В целом, Android-девайсы могут самостоятельно управлять RAM-памятью на оптимальном уровне. Закрытие приложений в общем списке приложений может улучить общую функциональность устройства, но это не имеет ничего общего с оптимизацией и эффективностью оперативной памяти.
На наш взгляд, автоматическое управление RAM-памятью Android-девайса – это самая быстрая и эффективная система, которую вы могли бы пожелать. Так что оставьте управление памятью самой ОС Android, и она вас не подведет
Сегодня предлагаем вашему вниманию небольшой материал о грамотном использовании памяти в Android.
Приятного чтения!
Эта статья посвящена базовым приемам управления использованием памяти в приложениях – например, в браузерах, фоторедакторах и программах для просмотра PDF – в которых предъявляются большие запросы к памяти.
Для начала немного теории
Большинство приложений для Android работают поверх среды исполнения (ART), заменившей ныне устаревающую виртуальную машину Dalvik. ART и Dalvik похожи на виртуальную машину Java (JVM), с которой их роднят схожие принципы проектирования. Они используют для хранения данных приложений два отдельных пространства: стек и кучу.
Стек-память
Стек-память в Java используется для хранения локальных переменных (примитивных типов и ссылок на объекты). Каждый поток Java имеет собственный отдельный стек. Стек-память относительно невелика по сравнению с памятью кучи. Размер стека Java в Dalvik обычно составляет 32 KB для кода Java и 1 MB для нативного кода (C++/JNI). В ART появился унифицированный стек для Java и C++, размер которого составляет около 1 MB.
Память кучи
Память кучи в Java используется виртуальной машиной для выделения объектов. Когда бы ни создавался объект, это происходит в куче. Виртуальные машины, например, JVM или ART, выполняют регулярную сборку мусора, убирают все объекты, на которые больше не осталось ссылок, и таким образом высвобождают память для выделения новых объектов.
Для обеспечения удобства использования Android жестко ограничивает размеры кучи для каждого работающего приложения. Предельный размер кучи варьируется от устройства к устройству и зависит от того, сколько RAM на этом устройстве. Если ваше приложение достигает предельного размера кучи и пытается выделить еще памяти, то выдается ошибка OutOfMemoryError , и приложение завершается. Давайте рассмотрим некоторые примеры, помогающие избежать такой ситуации.
Анализ памяти кучи
Самый важный инструмент, позволяющий разобраться с проблемами памяти в ваших приложениях и понять, как используется память – это профилировщик памяти, доступный в Android Studio.
Этот инструмент визуализирует, сколько памяти потребляет ваше приложение с течением времени. Можно делать мгновенные снимки кучи Java в работающем приложении, записывать операции выделения памяти и следить за кучей или этой хронологией выделений памяти в мощном UI.
Типичный сеанс работы с профилировщиком памяти должен выглядеть так:
- Отсматриваем наиболее частые выделения памяти и проходы сборщика мусора для выявления возможных проблем с производительностью.
- Отсматриваем, как использовалась память с течением времени, в особенности такие операции, на которые, как известно, требуется выделять много памяти. Убедитесь, что после завершения этих операций использование памяти снижается. Например, ниже показано, как воздействует на память активность PdfActivity из PSPDFKit после загрузки документа.
- Делаем дамп кучи в разные моменты времени исполнения вашего приложения и проверяем, как используется память. Ищем большие объекты, которые хранятся в памяти и не подпадают под сборку мусора. Дампы кучи также помогают выявить утечки памяти – например, можно поискать в дампе кучи ваши активности и посмотреть, были ли собраны их старые экземпляры.
Утечки памяти
Современные сборщики мусора – это сложные произведения технологического искусства, результат многолетних исследований и разработок, в которых участвовали сотни людей, от академиков до разработчиков-профессионалов. Однако до сих пор приходится быть начеку, чтобы не допускать утечек в памяти.
Образцовое решение для выявления утечек в памяти – библиотека LeakCanary. Она автоматически выдает уведомления, когда в вашей тестовой сборке (development build), выдавая вам стектрейс утечки в UI этой программы. Можно (и следует) интегрировать ее уже сегодня, тем более, что это не сложно!
Особенно легко спровоцировать утечки памяти, работая со сложными жизненными циклами активностей или фрагментов Android. Такое часто случается в тех точках, где разработчики удерживают сильные ссылки на контексты UI или другие UI-специфичные объекты в фоновой задаче или в статических переменных. Один из способов спровоцировать такие задержки – активно покрутить устройство, когда тестируете ваше приложение.
Высвобождайте память в ответ на события
Android может затребовать у приложения выделенную память или просто принудительно завершить его, когда память необходимо высвободить для выполнения более критичных задач. Прежде, чем это произойдет, система позволит вам отдать всю память, которая вам не нужна. В вашей активности понадобится реализовать интерфейс ComponentCallbacks2 . В таком случае, всякий раз, когда ваша система будет испытывать дефицит памяти, поступит вызов к вашему методу onTrimMemory() , и вы сможете высвободить память или отключить те возможности, которые не будут работать в таких условиях дефицита памяти.
Так, подобные обратные вызовы обрабатываются в приложении PSPDFKit. Приложение PSPDFKit проектировалось с расчетом активного использования памяти для кэширования, чтобы работа с приложением шла как можно более гладко. Исходно неизвестно, сколько памяти доступно на устройстве, поэтому PSPDFKit адаптируется к ситуации и ограничивает использование памяти, когда получает уведомления о том, что памяти недостаточно. Поэтому приложения, интегрированные с PSPDFKit, работают даже на низкотехнологичных устройствах, но со сниженной производительностью из-за того, что кэширование отключено.
Большая куча
Если для свойства largeHeap задано значение true , Android будет создавать все процессы для вашего приложения с большой кучей. Эта настройка предназначена только для тех приложений, которые по природе своей без нее работать не смогут, то есть, они используют объемные ресурсы, которые должны одновременно умещаться в памяти.
Настоятельно не рекомендуется использовать большую кучу, если тем самым вы хотите только поднять потолок возможного использования памяти. Использование памяти всегда нужно оптимизировать, поскольку даже большой кучи вашему приложению может не хватить при работе на слабом устройстве с небольшой памятью.
Проверка, сколько памяти сможет использовать ваше приложение
Никогда не помешает проверить, насколько велика куча вашего приложения и динамически адаптировать ваш код и доступные возможности под эти пределы памяти. Можно прямо во время исполнения проверить максимальный размер кучи при помощи методов getMemoryClass() или getLargeMemoryClass() (когда включена большая куча).
Android поддерживает даже такие устройства, на которых всего 512 MB RAM. Убедитесь, что не обошли вниманием и низкотехнологичные устройства! При помощи метода isLowRamDevice() можно проверить, не запущено ли ваше приложение на таком устройстве, где мало доступной памяти. Точное поведение этого метода зависит от устройства, но обычно он возвращает true на тех устройствах, где меньше 1 GB RAM. Нужно убедиться, что ваше приложение корректно работает и на этих устройствах, и на них отключать все возможности, использующие большой объем памяти.
Подробнее о том, как Android работает на устройствах с малым объемом памяти, можно почитать здесь; здесь же даются дополнительные советы по оптимизации.
Используйте оптимизированные структуры данных
Во многих случаях приложения используют слишком много памяти по той простой причине, что для них используются не самые подходящие структуры данных.
Коллекции Java не могут хранить эффективные примитивные типы и требуют упаковки их ключей и значений. Например, HashMap с целочисленными ключами следует заменять оптимизированным SparseArray . В конечном итоге, вместо коллекций всегда можно использовать сырые массивы, и это отличная идея, если ваша коллекция не поддается изменению размера.
К другим структурам данных, неэффективным с точки зрения использования памяти, относятся различные сериализации. Да, действительно, форматы XML или JSON удобны в использовании, можно сократить использование памяти, если работать с более эффективным двоичным форматом, например, буферами протоколов.
Все эти примеры с упоминанием структур данных, оптимизированных для экономии памяти – просто подсказки. Как и в случае с рефакторингом, нужно сначала найти источник проблем, а затем переходить к таким оптимизациям производительности.
Предотвращайте перемешивание памяти
Виртуальные машины Java/Android выделяют объекты очень быстро. Сборка мусора также идет весьма быстро. Однако при выделении большого количества объектов за короткий промежуток времени можно столкнуться с проблемой под названием «перемешивание памяти» (memory churn). В таком случае виртуальная машина не будет успевать выделять объекты в таком темпе, а сборщик мусора – их утилизировать, и приложение начнет притормаживать, а в экстремальных случаях даже израсходует всю память.
Основная проблема на территории Android в данном случае такова, что мы не контролируем, когда будет происходить сборка мусора. Потенциально это может приводить к проблемам: например, сборщик мусора работает именно в то время, пока на экране разворачивается анимация, и мы превышаем порог в 16 мс, обеспечивающий гладкое отображение кадров. Поэтому важно предотвращать чрезмерно активное выделение памяти в коде.
Пример ситуации, приводящей к перемешиванию памяти – выделение больших объектов, например, Paint внутри метода onDraw() представления. В таком случае быстро создается много объектов, и может начаться сборка мусора, которая может негативно повлиять на работу этого представления. Как указывалось выше, всегда нужно отслеживать использование памяти, чтобы избегать таких ситуаций.
Читайте также: