- 6 советов, которые помогут если на смартфоне мало оперативной памяти
- Не чини того, что не сломано
- Сколько оперативной памяти вам нужно?
- Узнайте, какие приложения используют оперативную память
- Не используйте Task Killer или RAM Booster
- Как использовать меньше оперативной памяти
- Устанавливайте «легкие» версии приложений
- Большие требования к памяти в Android – что делать?
- Для начала немного теории
- Анализ памяти кучи
- Утечки памяти
- Высвобождайте память в ответ на события
- Большая куча
- Проверка, сколько памяти сможет использовать ваше приложение
- Используйте оптимизированные структуры данных
- Предотвращайте перемешивание памяти
6 советов, которые помогут если на смартфоне мало оперативной памяти
У вас есть старый Android телефон или вы хотите играть в новейшие мобильные игры? Если да, то время от времени вы можете столкнуться с переполненной оперативной памятью, так как ваш телефон не успевает угнаться за технологиями.
Но что нужно делать в первую очередь и в каком случае? Давайте же разберемся, как правильно управлять оперативной памятью на Android.
Не чини того, что не сломано
Первое, что нужно сказать об управлении памятью на Android, это то, что если ваш телефон не является старым или слишком бюджетным, не нужно делать ничего!
Большинство флагманов и устройств среднего класса, вышедших за последние пару лет, будут иметь как минимум 4 ГБ ОЗУ. Флагман 2019 года, такой как, например, OnePlus 7 Pro или Galaxy Note 10 Plus, может иметь до 12 ГБ. Вам никогда не придется даже думать об управлении памятью на этих устройствах.
По большей части, Android очень эффективен, когда дело доходит до обработки памяти. Если вы проверите и обнаружите, что вся (или большая часть) доступной оперативной памяти используется, не беспокойтесь — именно так она и работает. Android старается хранить приложения в памяти как можно дольше, чтобы они запускались сразу же в следующий раз.
Если вам когда-нибудь все же потребуется освободить дополнительную память, система тихо закроет некоторые приложения, которые вы не использовали, в фоновом режиме.
Есть старая пословица: свободная оперативная память – это потраченная впустую оперативная память. Это определенно относится к Android.
Сколько оперативной памяти вам нужно?
Вам не нужно управлять своей памятью, если в телефоне ее хватает. Но какого объёма оперативной памяти действительно достаточно?!
В определенной степени это зависит от того, каким образом вы используете свой телефон. Если вы в основном занимаетесь просмотром веб-страниц и социальных сетей, то нужно гораздо меньше, чем если бы вы постоянно играли в PUBG или Call of Duty.
Что касается флагманов 2019 года, в Google решили, что для Pixel 4 достаточно 6 ГБ, в то время как для Galaxy S10 компания Samsung выбрала 8 ГБ. Мы полагаем, что 4 ГБ все еще достаточно для всех, кроме самых требовательных пользователей, и даже 3 ГБ хорошо в случае более легкого использования.
Службы Android и Google Play будут использовать до 1,5 ГБ ОЗУ самостоятельно, и они работают постоянно. В такой игре, как PUBG, будет использоваться более 1 ГБ, и даже если одновременно открыто несколько вкладок браузера, система будет работать нормально.
Узнайте, какие приложения используют оперативную память
Важнейшим условием управления ОЗУ является выяснение, каким образом используется память и какие приложения занимают большую ее часть. Вы можете сделать это с помощью инструмента памяти, который был представлен еще в Android 6 Marshmallow.
Расположение данного пункта меню зависит от версии Android:
- На Android 6 Marshmallow и 7 Nougat, зайдите в «Настройки» > «Память».
- Начиная с Android 8 Oreo, раздел «Память» находится в настройках разработчика. Поэтому сначала перейдите в «Настройки» > «О телефоне», а затем нажмите на пункт «Номер сборки» семь раз, чтобы отобразились параметры разработчика. Затем перейдите в «Настройки» > «Дополнительно» > «Параметры разработчика» > «Память».
После этих действий вы сможете увидеть среднее использование оперативной памяти за последние три часа и целый день. Нажмите на «Память, используемая приложениями», чтобы получить полное представление о том, какие приложения используют ОЗУ чаще всего. Это поможет определить программы, требующие наибольшее количество оперативной памяти, и, возможно, заменить их более эффективными альтернативами.
Не используйте Task Killer или RAM Booster
Уже давно известно, что «убийца задач» (task killer) плохо влияет на систему Android. Тем не менее, в Play Store до сих пор можно найти довольно большое количество приложений такого типа. Так что стоит повторить: убийца процессов не сделает телефон быстрее. Также этого не сделают и ускорители ОЗУ или любые другие приложения, которые обещают улучшения производительности.
Как мы уже говорили, Android и без того эффективно обрабатывает приложения и память, поэтому принудительное закрытие приложений будет мешать данному процессу. Это также замедлит запуск приложений в следующий раз, когда они вам понадобятся, и приведет к напрасной трате заряда батареи.
Что еще хуже, некоторые программы предназначены для работы в фоновом режиме. Завершение их с помощью убийцы задач часто просто приводит к тому, что они откроются снова. Это также тратит больше ресурсов. Если вам необходимо закрыть утилиту по какой-либо причине, сделайте это вручную. Нажмите кнопку «Последние приложения» внизу экрана или свайпните снизу вверх, если используете новые жесты Android. Когда появится список последних программа, закройте все, что вам больше не нужно, смахнув в сторону.
Как использовать меньше оперативной памяти
Когда вы работаете с телефоном, которому не хватает оперативной памяти, то производительность можно повысить за счет попыток ограничения объема используемой памяти.
Это не всегда легко. Такие приложения, как Facebook и Snapchat, являются печально известными источниками потребления ресурсов девайса, но у вас нет альтернативы, если вы используете сервисы такого типа. Но есть и другие шаги, которые можно предпринять:
- Сократите количество домашних экранов и не используйте живые обои или слишком много виджетов, которые постоянно обновляются.
- Удалите приложения, которые больше не нужны.
- Чтобы отключить предустановленное ПО, которое вы не используете, перейдите в «Настройки»> «Приложения и уведомления»> «Просмотреть все приложения», найдите программу и нажмите «Отключить».
- Устанавливайте все обновления программного обеспечения по мере их появления — как для приложений, так и для системы Android.
- Найдите альтернативные приложения, которые используют меньше памяти.
Устанавливайте «легкие» версии приложений
Когда в Google запустили Android Go для недорогих телефонов, компания также выпустила серию легких версий приложений Android Go в качестве альтернативы своим самым популярным программам. Вам не нужен телефон Go, чтобы их использовать — они будут работать на любом устройстве Android и задействуют намного меньше оперативной памяти.
Среди самых распространенных вариантов:
После их установки вы можете отключить полноразмерную альтернативу, используя метод, упомянутый выше. Обычно вы не можете полностью удалить эти встроенные приложения. Не думайте, что вам нужно придерживаться официальных приложений Google. Зачастую можно легко найти более быстрые и меньшие альтернативы многим из ваших любимых программ.
Например, Chrome довольно требователен к оперативной памяти, но вы можете легко заменить его на что-то вроде браузера Kiwi. Программа основана на том же движке рендеринга Chromium, поэтому веб-страницы выглядят одинаково. Он просто использует меньше памяти.
Теперь вы знаете, как управлять оперативной памятью телефона, чего следует избегать и как максимально эффективно использовать свой девайс. Но нехватка ОЗУ — не единственная аппаратная проблема, которая может повлиять на ваш смартфон. К счастью, мы можем помочь и с этими проблемами, поскольку на нашем сайте вы можете найти множество статей на различные тематики!
Источник
Большие требования к памяти в 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() представления. В таком случае быстро создается много объектов, и может начаться сборка мусора, которая может негативно повлиять на работу этого представления. Как указывалось выше, всегда нужно отслеживать использование памяти, чтобы избегать таких ситуаций.
Источник