Оптимизация системной памяти Android | Admin46
По просьбам нуждающихся немного про оптимизацию системной памяти в Android, о том как ее включить и зачем это делают. Ничего нового я не открою, однако по возможности постараюсь все просто расписать.
Оптимизация системной памяти Android
Первым делом немного терминологии о вспомогательных методах работы памяти:
Swap — создает блоки подкачки во внутренней памяти или в памяти флеш-карты, скорость работы напрямую зависит от скорости накопителя, однако пользователю эта разница вряд ли будет заметна.
zRam — создает блоки подкачки в оперативной памяти, что делает этот способ намного эффективнее.
Зачем оно вообще нужно и кому?
В первую очередь эта опция поможет людям, которые часто страдают от того, что приложения выгружаются из оперативной памяти. Включение оптимизации памяти в настройках позволяет ОС Android «перемещать» части приложений или приложения полностью из оперативной памяти во «вспомогательную».
Стоит отметить, что в теории включение оптимизации системной памяти android может сэкономить заряд аккумулятора вашего устройства.
Суть логики проста — при каждом новом запуске приложения расходуется N-ное количество энергии. Важно знать, что в момент запуска приложения происходит нагрузка на процессор, он повышает частоты, тем самым обеспечивая быстрый запуск приложения. Вот именно в этот момент и происходит вся экономия — если приложение не выгружалось(закрывалось) из памяти, то и затрат на новый запуск не будет, т.е нагрузка меньше.
Однако тестов такой экономии я не проводил, т.к. в значительном приросте времени работы аккумулятора сомневаюсь.
Как включить оптимизацию системной памяти Android?
Опция включается так:
Настройки — Дополнительные настройки — Для разработчиков — Оптимизация системной памяти.
Как включить пункт меню для разработчиков:
Заходим в меню настроек и ищем там раздел «О телефоне», открываем.
Открыв его скролим вниз и ищем «Номер сборки», тяпаем по нему семь раз
Как часто система будет пользоваться такой возможностью?
За вероятность/количество обращений к zRam, отвечает функция под названием «Swappiness», по умолчанию в моем смартфоне указано значение 100 — это означает что в 100% случаев приложения будут обращаться к zRam за помощью.
Как поменять значение Swappiness?
Самый простой способ, это скачать терминал и прописать в нем:
echo «60» > /proc/sys/vm/swappiness
где 60 это наше значение от 1 до 100.
либо идем по пути:
/proc/sys/vm/ открываем файл swappiness и меняем число от 1 до 100.
Как проверить работает ли оптимизация памяти?
В моем смартфоне оптимизация включена по умолчанию, проверить ее работу можно двумя способами:
- Скачать программу Diskinfo. После установки заходим в нее и в самом низу ищем пункт swap. Если пункт присутствует, значит оптимизация работает.

- Запустить 5-6 приложения и посмотреть не выгружаются ли они.
Что касается вариантов настройки оптимизации:
По умолчанию в моем девайсе было выставлено значение «Средняя», при таком выборе swap файл равен 1ГБ. Остальные варианты видимо меняют размер Swap в большую или меньшую сторону.
(Просмотров 26 920 )
Поделитесь записью в соц. сетях:
Повысьте производительность вашего телефона Android за счет оптимизации оперативной памяти
Понятно, что не все мобильные телефоны одинаковы. У вас может не быть проблем с производительностью с вашим новым Samsung Galaxy S10 + с 12 ГБ ОЗУ и Exynos 9820, а может и более скромные телефоны с 2гб ОЗУ (Хотя сейчас 3 ГБ становятся стандартом для оперативной памяти), это стоило им чего-то большего и годы давят на них. Что ж, мы покажем вам, как управлять своей оперативной памятью в случае, если вам не хватает производительности.
Вчера мы рассказали вам, как бороться с типичным сообщением: «Приложение остановлено», сегодня мы расскажем, как лучше контролировать свою оперативную память. Давайте максимально использовать эти терминалы с небольшими ресурсами!
Начинаем с базы, Что такое оперативная память? RAM означает Оперативная память. Короче говоря, это воспоминание позволяет хранить приложения, которые вы запускаете, в фоновом режиме
Когда вы открываете приложения, они остаются в ОЗУ и работают в фоновом режиме, что в конечном итоге замедляет работу телефона, но не только приложения, но и операционная система также потребляет ресурсы из этой памяти. Что мы можем сделать, чтобы оптимизировать ваше потребление?
Индекс
- 1 Закройте приложения, которые вы не будете использовать долгое время.
- 2 Успокойтесь с настройкой
- 3 Отключить анимацию
- 4 Удалить приложения
Закройте приложения, которые вы не будете использовать долгое время.

Здесь есть две позиции: те, которые одержимы и не закрывают приложения, и те, которые закрывают их все время. Оба плохие и дело в том, что, как сказал Аристотель, добродетель находится в средней точке, и именно так она работает и в этой ситуации.
Если, например, вы собираетесь использовать приложение банка для проверки баланса и все, возможно вам не нужно, чтобы приложение было открыто до конца дня, Ну что ж, займись многозадачностью и закрой приложение. Это предотвратит перегрузку оперативной памяти. Вам не нужно закрывать Instagram, если вы следите за ним каждые два на три, но то, что вы больше не собираетесь использовать, закройте его.
Подпишитесь на наш Youtube-канал
И в такой ситуации … Почему плохо постоянно закрывать приложения и оставлять многозадачность пустой? Ну, потому что, постоянно закрывая приложение, не считая того факта, что каждый раз, когда вы его открываете, его открытие будет занимать больше времени, чем если бы оно было загружено в ОЗУ, сильно разряжает аккумулятор, поскольку мобильному телефону каждый раз приходится делать «усилие», чтобы открывать его с нуля.
И пост не про экономию батареи, но его ценят. Правда?
Успокойтесь с настройкой
Да, я не говорю нет, этот футуристический виджет часов с этими обоями с постоянно движущимися буквами Матрицы действительно круто, но … Он загружается в оперативную память телефона, и вы делаете его всегда более загруженным того, к чему это прикасается. Тяжелые пусковые установки, виджеты, движущиеся обои и т. Д. — это вещи, которые загружают вашу оперативную память.Ой, и они быстрее разряжают батарею. Мы не говорим не использовать их, но немного ограничим их использование.
Отключить анимацию
Мы уже говорили о более широких словах: если у вас действительно проблемы с оперативной памятью, мы собираемся начать с радикальных мер, хотя, если вы любитель скорости, этот вариант также может вас заинтересовать.
мы говорим о отключить анимацию Android, Это может быть не так красиво, но пойдет намного быстрее. Есть производители, такие как OnePlus, которые позволяют отключать все анимации системы, но если это не так, мы покажем вам, как это сделать.
Первое, что нам нужно сделать, это активировать параметры разработчика. Для этого вам нужно будет перейти к информации вашего телефона и нажать на Номер сборки примерно пять или семь раз, пока вы не получите сообщение о том, что вы активировали параметры разработчика.
Хорошо, как только вы это сделаете, вы можете получить доступ к параметрам разработчика из Система> Параметры разработчика.
Попав внутрь, вы попадаете в раздел чертеж, там вы увидите, что у вас есть несколько вариантов анимации (Масштаб анимации с окном, анимация перехода и т. д.). Вы открываете их все и отключаете анимациюЕсли они вам тоже не нужны и вы видите, что все идет хорошо при 0,5х, можете оставить все как есть.
Удалить приложения
Если вы действительно видите, что ваш телефон больше себя не дает, вы можете начать удаление приложений. Существуют приложения, которые потребляют чрезмерное количество оперативной памяти, даже если они не используются, например Facebook или Facebook Messenger.
Вы можете увидеть потребление оперативной памяти в Приложения и уведомления. Вы выбираете приложение, и есть раздел памяти, где вы можете его увидеть, чтобы вы могли знать, что потребляет каждое приложение и какое из них вам нужно удалить.
Как насчет? Вы знали эти уловки? Или с оперативной памятью проблем нет?
Управление памятью в Android. Управление памятью Android | by Niharika Arora
Android использует подкачку и mmap вместо предоставления пространства подкачки, что означает, что любая память, к которой прикасается ваше приложение, не может быть выгружена, пока вы не освободите все ссылки.
Размер кучи виртуальной машины Dalvik* для процессов приложений ограничен. Приложения запускаются с 2 МБ, а максимальное выделение, помеченное как «largeHeap», ограничено 36 МБ (в зависимости от конкретной конфигурации устройства). Примерами приложений с большой кучей являются Photo/Video Editor, Camera, Gallery и Home Screen.
Android хранит фоновые процессы приложений в кэше LRU.
Когда системе не хватает памяти, она убивает процессы в соответствии со стратегией LRU, но также учитывает, какое приложение потребляет больше всего памяти. В настоящее время максимальное количество фоновых процессов равно 20 (в зависимости от конкретной конфигурации устройства). Если вам нужно, чтобы ваше приложение дольше работало в фоновом режиме, освободите ненужную память перед переходом в фоновый режим, и система Android с меньшей вероятностью выдаст сообщение об ошибке или даже завершит работу приложения.
Среда управляемой памяти, такая как виртуальная машина ART или Dalvik, отслеживает каждое выделение памяти. Как только он определяет, что часть памяти больше не используется программой, он освобождает ее обратно в кучу без какого-либо вмешательства со стороны программиста. Механизм освобождения неиспользуемой памяти в среде управляемой памяти известен как сборка мусора . Сборка мусора преследует две цели: найти объекты данных в программе, к которым нельзя будет получить доступ в будущем; и восстановить ресурсы, используемые этими объектами.
Куча памяти Android относится к поколениям, а это означает, что существуют разные группы выделений памяти, которые она отслеживает в зависимости от ожидаемого срока службы и размера выделяемого объекта. Например, недавно выделенные объекты относятся к молодому поколению . Когда объект остается активным достаточно долго, его можно повысить до более старого поколения, за которым следует постоянное поколение.
Каждое поколение кучи имеет свой собственный выделенный верхний предел объема памяти, который могут занимать объекты. Каждый раз, когда поколение начинает заполняться, система выполняет событие сборки мусора, пытаясь освободить память. Продолжительность сборки мусора зависит от того, какое поколение объектов оно собирает и сколько активных объектов находится в каждом поколении.
Несмотря на то, что сборка мусора может быть довольно быстрой, она все же может повлиять на производительность вашего приложения. Обычно вы не контролируете, когда происходит событие сборки мусора из вашего кода.
В системе есть работающий набор критериев для определения того, когда выполнять сборку мусора. Когда критерии удовлетворяются, система прекращает выполнение процесса и начинает сборку мусора. Если сборка мусора происходит в середине цикла интенсивной обработки, такой как анимация или воспроизведение музыки, это может увеличить время обработки. Это увеличение потенциально может привести к тому, что выполнение кода в вашем приложении превысит рекомендуемый порог в 16 мс для эффективного и плавного рендеринга кадров.
Кроме того, ваш поток кода может выполнять виды работы, которые заставляют события сборки мусора происходить чаще или заставляют их длиться дольше, чем обычно. Например, если вы выделяете несколько объектов в самой внутренней части цикла for во время каждого кадра анимации альфа-смешивания, вы можете засорить кучу памяти большим количеством объектов. В этом случае сборщик мусора выполняет несколько событий сборки мусора и может снизить производительность вашего приложения.
Студия Android включает инструмент отладки под названием Dalvik Debug Monitor Service (DDMS). DDMS предоставляет такие услуги, как захват экрана на устройстве, многопоточность, информация о куче на устройстве, logcat, процессы, входящие вызовы, проверка SMS, местоположение, спуфинг данных и многое другое, связанное с тестированием вашего приложения для Android.
DDMS подключает IDE к приложениям, работающим на устройстве. В Android каждое приложение работает в своем собственном процессе, в каждом из которых размещается собственная виртуальная машина (ВМ). И каждый процесс прослушивает отладчик на другом порту.
При запуске DDMS подключается к ADB ( Android Debug Bridge , утилита командной строки, входящая в состав Google Android SDK). Отладчик Android используется для отладки приложения Android и запускает службу мониторинга устройств между ними. Это уведомит DDMS о подключении или отключении устройства. Когда устройство подключено, между ADB и DDMS создается служба мониторинга ВМ, которая уведомляет DDMS о запуске или завершении работы ВМ на устройстве.
Android — это всемирная мобильная платформа, и миллионы разработчиков Android занимаются созданием стабильных и масштабируемых приложений. Вот список советов и рекомендаций по улучшению использования памяти в приложениях Android:
- Будьте осторожны при использовании шаблона проектирования с «абстракцией». Хотя с точки зрения шаблона проектирования абстракция может помочь построить более гибкого архитектора программного обеспечения. В мобильном мире абстракция может включать в себя побочный эффект для выполнения своего дополнительного кода, что потребует больше времени и памяти. Если абстракция не может обеспечить вашему приложению значительную пользу, вам лучше не использовать ее.
- Избегайте использования «enum». Перечисление удваивает выделение памяти, чем обычная статическая константа, поэтому не используйте его.
- Попробуйте использовать оптимизированные контейнеры SparseArray, SparseBooleanArray и LongSparseArray вместо HashMap. HashMap выделяет объект записи во время каждого сопоставления, что является неэффективным действием памяти, а также поведение с низкой производительностью — «автоупаковка/распаковка» распространяется на все использование.
Вместо этого контейнеры, подобные SparseArray, сопоставляют ключи с простым массивом. Но помните, что эти оптимизированные контейнеры не подходят для большого количества элементов, при выполнении действий добавления/удаления/поиска они медленнее, чем Hashmap, если ваш набор данных превышает тысячи записей. - Избегайте создания ненужных объектов. Не выделяйте память специально для краткосрочных временных объектов, если этого можно избежать, и сборка мусора будет происходить реже, когда создается меньше объектов.
- Проверьте доступную кучу вашего приложения. Вызовите ActivityManager::getMemoryClass(), чтобы узнать, сколько кучи (МБ) доступно для вашего приложения. Исключение OutofMemory возникнет, если вы попытаетесь выделить больше памяти, чем доступно. Если ваше приложение объявляет «большую кучу» в AndroidManifest.xml, вы можете вызвать ActivityManager::getLargeMemoryClass() для запроса предполагаемого большого размера кучи.
- Координация с системой путем реализации обратного вызова onTrimMemory().
Внедрите ComponentCallbacks2::onTrimMemory(int) в Activity/Service/ContentProvider, чтобы постепенно освобождать память в соответствии с последними системными ограничениями. onTrimMemory(int) повышает общую скорость отклика системы, а также дольше поддерживает ваш процесс в системе. - Когда возникает TRIM_MEMORY_UI_HIDDEN, это означает, что весь пользовательский интерфейс в вашем приложении был скрыт, и вам необходимо освободить ресурсы пользовательского интерфейса. Когда ваше приложение находится на переднем плане, вы можете получить TRIM_MEMORY_RUNNING[MODERATE/LOW/CRITICAL] или в фоновом режиме вы можете получить TRIM_MEMORY_[BACKGROUND/MODERATE/COMPLETE]. Вы можете освободить некритические ресурсы на основе стратегии освобождения памяти при нехватке системной памяти.
- Внешние библиотеки следует использовать с осторожностью. Внешние библиотеки часто пишутся для немобильных устройств и могут быть неэффективны в Android. Вы должны принять во внимание усилия по переносу и оптимизации библиотеки для мобильных устройств, прежде чем решите ее использовать.
Если вы используете библиотеку только для одной или двух функций из тысяч других применений, может быть лучше реализовать ее самостоятельно. - Службы следует использовать с осторожностью. Если вам нужна служба для запуска задания в фоновом режиме, избегайте ее работы, если она не активно выполняет задачу. Попробуйте сократить срок его службы, используя IntentService, который завершит свою работу, когда завершит обработку намерения. Службы следует использовать с осторожностью, чтобы никогда не оставлять одну из них работающей, когда она не нужна. В худшем случае общая производительность системы будет низкой, и пользователи найдут ваше приложение и удалят его (если это возможно).
- Но если вы создаете приложение, которое должно работать в течение длительного периода времени, например, службу музыкального проигрывателя, вы должны разделить его на два процесса: один для пользовательского интерфейса, а другой для фоновой службы, установив свойство «android:process» для вашей службы в AndroidManifest.
xml. Ресурсы в процессе пользовательского интерфейса могут быть освобождены после скрытия, в то время как служба фонового воспроизведения все еще работает. Имейте в виду, что процесс фоновой службы НЕ ДОЛЖЕН касаться какого-либо пользовательского интерфейса; в противном случае выделение памяти будет удвоено или утроено!
Аккуратно используйте память. Советы, приведенные выше, могут постепенно принести пользу вашему приложению и продлить его работу в системе. Но все преимущества будут потеряны, если произойдет утечка памяти. Вот некоторые знакомые потенциальные утечки, которые разработчик должен иметь в виду.
- Не забудьте закрыть курсор после запроса базы данных. Если вы хотите держать курсор открытым в течение длительного времени, вы должны использовать его осторожно и закрыть его, как только задача базы данных завершится.
- Не забудьте вызвать unregisterReceiver() после вызова registerReceiver().
- Избегайте утечки контекста. Если вы объявите статическую переменную-член «Drawable» в своей Activity, а затем вызовете view.
setBackground(drawable) в onCreate(), после поворота экрана будет создан новый экземпляр Activity, а старый экземпляр Activity никогда не сможет быть освобожден. потому что drawable установил представление как обратный вызов, а представление имеет ссылку на действие (контекст). Утечка экземпляра Activity означает значительный объем памяти, что легко приведет к OOM. - Есть два способа избежать такой утечки:
- Не хранить долгоживущие ссылки на контекстную активность. Ссылка на действие должна иметь тот же жизненный цикл, что и само действие.
- Попробуйте использовать контекстное приложение вместо контекстной активности.
5. Будьте осторожны при использовании потоков. Потоки в Java — это корни сборки мусора; то есть виртуальная машина Dalvik (DVM) хранит жесткие ссылки на все активные потоки в системе выполнения, и в результате потоки, оставшиеся работающими, никогда не будут допущены к сборке мусора. Потоки Java будут сохраняться до тех пор, пока они не будут явно закрыты или весь процесс не будет уничтожен системой Android.
Вместо этого платформа приложений Android предоставляет множество классов, предназначенных для облегчения фоновой работы разработчиков:
- Используйте загрузчик вместо потока для выполнения кратковременных асинхронных фоновых запросов в сочетании с жизненным циклом Activity.
- Используйте службу и сообщите о результатах в действие с помощью BroadcastReceiver.
- Используйте AsyncTask для кратковременных операций.
Средство профилирования Android поможет вам управлять памятью на устройстве Android. Android SDK предоставляет два способа профилирования памяти приложения:
- Использование Allocation Tracker
- Использование дампа кучи
Allocation Tracker записывает каждое выделение памяти, которое приложение выполняет во время цикла профилирования. Средство отслеживания распределения полезно, когда вы хотите узнать, какой тип распределения памяти имеет место. Но это не дает вам никакой информации о куче приложения, которая представляет собой память , отведенную для динамического распределения памяти.
Средство отслеживания распределения отображает выделение памяти для выбранного процесса. Он показывает конкретные выделяемые объекты вместе с потоком, методом и строковым кодом, который их выделил.
DDMS предоставляет возможность отслеживать объекты, выделяемые в память, и видеть, какие классы и потоки выделяют эти объекты. Это позволяет вам отслеживать, где размещаются объекты в режиме реального времени, когда вы выполняете определенные действия в своем приложении. Эти данные полезны для измерения использования памяти, которое в противном случае может повлиять на производительность приложения.
- Установите приложение в эмулятор Android или на устройство. Нажмите кнопку Android в нижней части Android Studio.
- Начать отслеживание распределения.
- Поэкспериментируйте с приложением некоторое время.
- Остановить отслеживание распределения.
См. рисунок ниже:
- Через несколько секунд откроется панель с вашими записанными данными.

Дамп кучи — это моментальный снимок кучи приложения, который хранится в двоичном формате HPROF. Виртуальная машина Dalvik может создавать полный дамп содержимого виртуальной кучи. Это очень полезно для отладки использования памяти и поиска утечек памяти.
Я бы сказал, что разработать приложение для Android легко, но оптимизация и управление памятью требуют времени и работы. Разработчик должен сосредоточиться на этих параметрах.
Первоначально опубликовано здесь.
Пожалуйста, поделитесь своим мнением в комментариях.
хранилище — Как избавиться от ненужной системной памяти?
TL;DR
Размер моей системной памяти не переставал увеличиваться на моем Android 12 Pixel 4a (ситуация аналогична OP). Я смог восстановить его, сохранив большие фиктивные файлы в бесплатном хранилище (на стороне пользователя, во внутреннем хранилище), а затем снова удалив их.
Подробные инструкции
Выберите большой файл, который у вас есть: фильм, Linux ISO, Android ROM и т.
д. Создайте несколько папок во внутреннем хранилище с фиктивными именами и скопируйте один и тот же файл в каждую из папок. Вы увидите, как размер системного хранилища будет уменьшаться по мере того, как вы будете использовать все больше и больше места на стороне пользователя. Как только системное хранилище немного уменьшится, вы можете скопировать следующий пакет файлов. Промыть и повторить.
Мой опыт
В моем случае я начал с системного хранилища, используя 72 ГБ из моей 128 ГБ памяти, и в итоге получил только 14 ГБ системного хранилища, таким образом освободив почти 60 ГБ. Я узнал, что Android освободит 1 ГБ, когда хранилище будет заполнено, поэтому я работал с файлами размером около 700 МБ за раз.
Как оптимизировать процесс
Я обнаружил, что использование FTP-сервера на моем телефоне и загрузка файла с моего ПК замедляют процесс таким образом, что Android может не отставать от копии и вовремя освобождать достаточно места для хранения. следующий файл.
Поэтому я подготовил большое количество файлов на своем ПК и дал ему поработать один час, пока не появилось предупреждение о том, что на моем телефоне заканчивается память. Мне пришлось немного повозиться, потому что многие приложения в этот момент вылетали из строя, но после освобождения памяти телефон возобновил нормальную работу.
Моя теория о том, почему это работает (по крайней мере, для меня)
Обоснование этого механизма заключается в том, что Android (по крайней мере, в последних версиях) будет использовать все свободное хранилище, которое он может получить для внутреннего использования, особенно кэш для системы. компоненты. Многие уже намекают на такое поведение в интернете и рекомендуют очистить кеш приложения, что я и сделал безрезультатно. Загвоздка в том, что, хотя пользователь может очистить кеш установленных пользователем приложений, кеш системных компонентов нельзя очистить без рутирования телефона или сброса настроек к заводским, и ни один из них не подходит для повседневного использования.



Вместо этого контейнеры, подобные SparseArray, сопоставляют ключи с простым массивом. Но помните, что эти оптимизированные контейнеры не подходят для большого количества элементов, при выполнении действий добавления/удаления/поиска они медленнее, чем Hashmap, если ваш набор данных превышает тысячи записей.
Внедрите ComponentCallbacks2::onTrimMemory(int) в Activity/Service/ContentProvider, чтобы постепенно освобождать память в соответствии с последними системными ограничениями. onTrimMemory(int) повышает общую скорость отклика системы, а также дольше поддерживает ваш процесс в системе.
Если вы используете библиотеку только для одной или двух функций из тысяч других применений, может быть лучше реализовать ее самостоятельно.
xml. Ресурсы в процессе пользовательского интерфейса могут быть освобождены после скрытия, в то время как служба фонового воспроизведения все еще работает. Имейте в виду, что процесс фоновой службы НЕ ДОЛЖЕН касаться какого-либо пользовательского интерфейса; в противном случае выделение памяти будет удвоено или утроено!
setBackground(drawable) в onCreate(), после поворота экрана будет создан новый экземпляр Activity, а старый экземпляр Activity никогда не сможет быть освобожден. потому что drawable установил представление как обратный вызов, а представление имеет ссылку на действие (контекст). Утечка экземпляра Activity означает значительный объем памяти, что легко приведет к OOM.