- Большие требования к памяти в Android – что делать?
- Для начала немного теории
- Анализ памяти кучи
- Утечки памяти
- Высвобождайте память в ответ на события
- Большая куча
- Проверка, сколько памяти сможет использовать ваше приложение
- Используйте оптимизированные структуры данных
- Предотвращайте перемешивание памяти
- Как освободить и увеличить память устройства под управлением Android
- Обязательная карта памяти
- Поддержка карт памяти SD
- Полезные приложения для очистки памяти
- Очистка системы 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.
Когда приложение выбирает всю стек-память до предела, выдается ошибка StackOverflowError . Наиболее вероятные причины, по которым может быть достигнут предел стека – либо бесконечная рекурсия, либо чрезмерно глубокий вызов метода. Ссылки на стек-память всегда делаются в очередности LIFO (последним пришел – первым обслужен). Всякий раз при вызове метода в стек проталкивается новый фрейм с локальными переменными этого метода. Когда метод завершит работу, его фрейм выталкивается из стека, и любое возможное результирующее значение отправляется обратно в стек. Итак, первая проблема (бесконечная рекурсия) – это баг, который легко исправить, но вторая требует некоторого рефакторинга, заключающегося в разворачивании рекурсивных вызовов метода и преобразования их в цикл.
Память кучи в 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, работают даже на низкотехнологичных устройствах, но со сниженной производительностью из-за того, что кэширование отключено.
Большая куча
Одно из лобовых решений, позволяющих справиться с высокими требованиями к памяти – запросить большую кучу Dalvik для вашего приложения. Для этого можно добавить android:largeHeap=»true» к тегу в файле AndroidManifest.xml .
Если для свойства 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() представления. В таком случае быстро создается много объектов, и может начаться сборка мусора, которая может негативно повлиять на работу этого представления. Как указывалось выше, всегда нужно отслеживать использование памяти, чтобы избегать таких ситуаций.
Источник
Как освободить и увеличить память устройства под управлением Android
Производители телефонов, особенно с низкой и средней полки, часто оснащают свои продукты внутренней памятью слишком малой емкости, но оставляют возможность расширить её с помощью карты памяти microSD. Смартфонов без соответствующего гнезда, к счастью, всё меньше и меньше, но у пользователей немного причин для радости.
8 ГБ в спецификации выглядит не плохо, однако, нужно иметь в виду, что примерно половина этого пространства займёт операционная система и предустановленные приложения, от которых очень сложно избавиться. В вашем распоряжении останется около 4 ГБ памяти, – это в лучшем случае. В некоторых моделях это место сокращается до 3 ГБ, и это только в самом начале использования смартфона.
Сразу после запуска выяснится, что предустановленные приложения устарели, а загрузка новых версий немедленно приведёт к снижению количества свободного места. К этому добавляются программы, которые мы устанавливаем сами, а в будущем также обновления операционной системы, прошивки и исправления безопасности. Всё это приводит к тому, что память быстро заполняется и в какой-то момент просто заканчивается.
Не все также понимают, что при использовании приложение создаёт много дополнительных мегабайт в виде временных файлов и файлов с данными. Интернет-браузеры и игры могут создавать файлы, объем которых со временем измеряется в гигабайтах. К счастью, мы не бессильны в такой ситуации и даже устройство с небольшой памятью может нам служить вам хорошо, если мы будем принимать необходимые процедуры.
Обязательная карта памяти
Первый способ увеличить объем памяти в смартфоне или в планшете – это покупка и установка на карты памяти microSD. В случае устройств с 8 ГБ встроенной памяти, это процедура совершенно необходима, если мы хотим в полной мере использовать устройство. Когда у нас нет такой карты, все данные, такие как фильмы и фотографии с камеры, хранятся во встроенной памяти, если их качество является хорошим, оно быстро заполнят память. К сожалению, недостатком этого решения является то, что не всё может быть сохранено или перенесено на карту. Многие приложения просто должны быть установлены во внутренней памяти, чтобы они могли работать должным образом. В некоторых моделях телефонов мы найдём функцию, которая позволяет отформатировать карту таким образом, чтобы она была видна системе как внутренняя память.
В этой ситуации рекомендуется использование высокоскоростную карту microSD, чтобы не замедлять работу вашего телефона. Стоит рассмотреть относительно новый класс карт памяти, предназначенных для использования в смартфонах. Такие носители обозначаются символом A1, что гарантирует производительность, необходимую для запуска и работы приложения (случайное чтение 1500 IOPS и случайная запись 500 IOPS при последовательной передаче не меньше 10 МБ/сек).
Стоит также иметь в виду, что не все телефоны и планшеты поддерживают карты объемом 64, 128 ГБ и больше. Никаких проблем не должно быть с картами на 32 гигабайта и меньше, которые должны работать с практически любым устройством.
Поддержка карт памяти SD
Если мы являемся счастливыми обладателями смартфона с кард-ридером, то решение проблемы с нехваткой места для данных найдётся очень легко, хотя и здесь могут скрываться различные неудобства.
Первое – это разъем гибридный dual SIM, используемый некоторыми производителями. Это довольно «проблемное изобретение» для людей, которым нужно использовать одновременно два номера. Слот для второй SIM-карты, одновременно, служит в качестве ридера карт microSD, приходится выбирать – либо расширение памяти, либо второй номер телефона.
Если карта уже в ридере, то нам остается её только отформатировать. Переходим к Настройкам системы и из списка выбираем Память, а затем нажмите Карта памяти. Теперь, в зависимости от модели телефона и операционной системы, выбираем пункт Форматировать как внутреннюю память. Последний пункт был введен в Android 6.0 (Зефир), что позволяет «связать» SD-карту с внутренней памятью смартфона.
Благодаря этому, исчезает проблема свободного места для приложений, но в то же время мы не сможем использовать такие карты в качестве носителя на другом устройстве, или скопировать из неё данные непосредственно при подключении к компьютеру.
Стоит также добавить, что сам Android версии 6.0 или более поздней версии, не гарантирует форматирования карты в качестве внутренней памяти. Производители часто блокируют такую возможность в более дешевых устройствах, чтобы побудить нас к покупке более дорогой модели.
Если в нашем телефоне нет функции объединения SD карт с внутренней памятью, нам остается перенос данных на внешний носитель. Чтобы это сделать, необходимо зайти в список установленных приложений. Внизу открываем Диспетчер приложений и находим программу для переноса. После её выбора нажмите Память, а затем кнопку Изменить.
В это время на экране появится меню изменения памяти, из которого мы выбираем Карту памяти. Нажмите кнопку Переместить . Через несколько десятков секунд перенос будет завершён.
Важное примечание: приложения перемещенные на карту не будут работать после её извлечения из устройства.
Носитель SD разгрузит также внутреннюю память в ситуации, когда мы делаем много фотографий или записываем видео с помощью встроенной камеры. Просто в опциях приложения для съемки выберите опцию записи на карту памяти. Большинство современных телефонов установит её автоматически после обнаружения присутствия карты в считывателе.
Хранение файлов на внешней карте облегчит их перенос на пк, а также защитит их в случае поломки смартфона. Функцию автоматической записи фотографий на карту памяти в системном приложении «Камера» можно найти в настройках – Место хранения.
Полезные приложения для очистки памяти
Очистку системы от ненужных приложений и файлов мы можем провести вручную, с помощью настроек системы. Однако, не каждый пользователь имеет желание, время и навыки, чтобы сделать это самому.
С этой целью лучше всего воспользоваться одной из многих бесплатных программ, предназначенных для комплексной оптимизации. Одним из лучших и самых популярных инструментов является CCleaner – хорошо известный пользователям персональных компьютеров.
Программа позволяет оптимизировать работу как внутренней памяти, так и оперативной памяти устройства. После запуска CCleaner отображает уровень использования памяти устройства. Перед началом работы с программой, стоит зайти в её Настройки и активировать Углубленную очистку, которая позволяет удалять также скрытую кэш-память.
Затем в главном меню нажмите на кнопку Анализ и дождитесь результатов сканирования. В конце приложение выдаст отчет. Мы можем выбрать элементы, которые будут удалены, например, кэш-память, миниатюры изображений или данные приложения.
CCleaner автоматически выбирает те из них, которые могут быть безопасно удалены (без потери данных), а такие разделы как Данные приложений или Загрузки вы должны выбрать сами, потому что их удаление связано с потерей данных, настроек или скачанных из интернета файлов.
Другие интересные функции программы – Менеджер приложений с функцией распределения программ с учетом места, которое они занимают, и возможностью их гибернации, если вы редко им пользуемся. Полезен также инструмент для анализа памяти, который сообщит нам, какие данные занимают много пространства в памяти.
Что «съедает» внутреннюю память смартфона:
- обновление предустановленных приложений и операционной системы
- временные файлы операционной системы и приложений
- генерируемые и хранимые в программе данные
- файлы кэша приложения
- миниатюры предварительного просмотра фотографий
- файлы, загруженные приложениями
- игры и приложения, устанавливаемые пользователем
- данные в автономном режиме, например, карты
Очистка системы Android
С помощью инструментов системы Android мы можем легко и быстро освободить ресурсы памяти нашего смартфона. Первый и самый простой способ – обзор установленных приложений и удаление ненужных и неиспользуемых.
Часто мы также устанавливаем несколько программ одного типа, например, погодные приложения или новостные. Стоит оставить только те, которыми мы пользуемся чаще всего.
Пользователи обычно не понимают, сколько программ у них установлено. Приложения устанавливают для пробы, а потом о них забывают.
Чтобы проверить, какие программы мы используем реже всего, достаточно зайти в Магазин Play, выбрать Мои игры и приложения и перейти на вкладку на Установленные.
Затем просто отсортировать их по ключу Использовались в последнее время. В самом конце списка, мы найдем те, которые мы совсем не пользуемся. Затем найдите в Диспетчере приложений устройства соответствующую программу и нажмите кнопку Удалить .
Не надо беспокоиться: удаляя программы, за которые мы заплатили в Google Play, с помощью той же учетной записи, мы сможем их снова установить в любой момент.
В случае приложений, встроенных в систему, вместо кнопки Удалить вы можете увидеть другую, например, Отключить или Удалить обновления . Если вы не собираетесь использовать такую программу, Вы можете воспользоваться этими функциями, что освободит немного места в памяти.
Стоит нажать также кнопку Остановить принудительно , это приведёт к тому, что приложение не будет работать в фоновом режиме и освободит ресурсы. Не будет также генерировать дополнительные файлы, в том числе временные.
Если мы не хотим удалять приложения, мы можем вместо кнопки Удалить, выбрать пункт Память и очистить файлы и кэш. В первом случае мы потеряем данные программы, такие как настройки или данные для входа.
В случае кэш-памяти (кэш) не нужно удалять ее отдельно для каждого из приложений. Можно сделать это быстро с помощью функции, доступной в Настройках под названием Память. Просто выберите Память устройства и нажмите Кэшированные данные, а затем Удалить. Таким образом, мы можем быстро освободить до нескольких ГБ свободного места, не теряя информации.
Субботник в памяти
Активно используя телефон, мы собираем свой «урожай» на диске. Файлы с музыкой, смешные видео, PDF-документы и т.п. всё чаще оказываются в папке загрузки (Download), или, когда мы обмениваемся с другими пользователями, в папке Bluetooth.
Для просмотра содержимого памяти мы можем использовать любой файловый менеджер с Play Store (например, Total Commander или родной Solid Explorer) или встроенный инструмент – Мои Файлы.
В Моих Файлах мы найдём Историю загрузок и функцию хранения данных в облаке. Данные мы можем удалить или переместить на карту памяти, освободив место для новых данных.
Самая интересная, однако, функция хранения в облаке, благодаря которой после создания учетной записи мы можем бесплатно хранить данные на виртуальном диске.
Удобным приложением для мобильных фотографов может оказаться Google Photos или ему подобное. Эта программа автоматически будет отправлять фотографии в облако, одновременно, освободив пространство на вашем телефоне.
Резюме
Пользователи телефонов и планшетов хранят в памяти своих устройств всё больше и больше данных, которые со временем перестают быть актуальными. Благодаря приведенным выше советам, даже смартфоны с самой нижней полки могут быть полезны, так как система Android позволяет легко управлять пространством. Кроме того, нам доступно много бесплатных программ, которые проведут оптимизацию автоматически – с ничтожным участием пользователя.
К сожалению, жизненный цикл среднестатистического телефона с Android – это, примерно, три года. Спустя это время он часто становится «памятником» и никакие процедуры, позволяющие увеличить количество места, уже не будут приносить ожидаемых результатов. Покупка смартфона с большей памятью и новейшей операционной системой, безусловно, продлит срок комфортного использования.
Источник