Кто использует оперативную память андроид

DarkNess

Личный блог DarkNess. Только технические темы.

среда, июля 03, 2013

Освобождаем оперативную память (ОЗУ/RAM) Android — «условно ненужные программы».

Вы все вероятно наблюдали, что после суток работі телефона на Android, количество свободной памяти снижается, и при этом даже использование «таск киллеров», освобождает далеко не столько памяти, сколько тот же «таск киллер» освобождает сразу после загрузки. И при этом просмотр в таск менеджере, показывает, что «запущены только те же программы что были запущены и сразу после старта». Куда делась память ? И главное — что с этим делать ? Как выяснилось, большинство менеджеров памяти, не показывают значительную часть программ, которые они считают «системными» (даже если по описанию они и могут показывать системные — все равно показывают не все), а для тех что показывают — нагло врут на счет реального обьема используемой ими памяти. Причина проста — большинство таск менеджеров отслеживают нормаьно только «стандартные программы Андроид», и в упор не видят или не правильно определяют обьем памяти для программ, которые работают на системном уровне и написаны не на Ява а на С, или если их части на С. В результате они не видят довольно много программ, которые «самозапускаются», даже если их запуск отключен и висят в памяти, ее отжирая, даже если Вы их вообще никогда не используете. Как «увидеть невидимое» и «обуздать» «невидимок» ?

Большая часть нижеописанное работает ТОЛЬКО на рутованном Андроиде.
Прежде всего ставим программу OSmonitor которую берем здесь: https://play.google.com/store/apps/details?id=com.eolwral.osmonitor&hl=ru . Это одна из немногих программ (не считая линуксной консоли естественно :), способная показать реальное использование памяти ВСЕМИ программами, и к стати позволяет их и «убивать». С ее помощью, Вы всегда сможете посмотреть что у Вас «самозапустилось» и «втихую жрет драгоценную память», заодно и «пристрелить нахала» 🙂 В его просмотрщике процессов, Вы можете отсортировать их как Вам удобнее — по «пожиранию» процессора, по «расходу памяти» итд. Собственно, то что описано ниже, сделано именно благодаря информации, полученной через OSmonitor. Еще нам понадобится программа System Tuner, которую можно взять здесь: http://4pda.ru/forum/index.php?showtopic=230331, или вот здесь: https://play.google.com/store/apps/details?id=ccc71.pmw&hl=ru.
Основными методами у нас будут «замораживание» (с помощью System tuner), и в отдельных случаях — деинсталяция, с предварительным бэкапом, чтобы всегда можно было поставить назад если понадобится — есть отдельные «нахальные» программы. которые запускаются даже из «замороженного» вида.

Итак. Программы, которые «самозапускаются» и не видны в таск менеджерах, и при этом могут Вами использоваться крайне редко или не использоваться никогда, но всегда отнимают память.

Синхронизация контактов и календаря. (это не требует рутованного телефона) Если это Вам не нужно, то зайдите в настройки телефона, «учетные записи и синхронизация», выберите свой аккаунт, уберите галочки напротив «Календарь» и «Контакты». После перезапуска, они больше не будут самозапускаться. Это сэкономит 15-25 мегабайт памяти ОЗУ.

FM радио. Если Вы им пользуетесь — оставляем в покое. Но я например им не ползуюсь никогда — по IP и качество выше, и станций больше. Постоянно занимает 15-20 мегабайт ОЗУ, невидимо в большинстве таск менеджеров. Программа оказалась самой «противной». В том смысле, что она запускается, даже будучи «замороженной». Делаем ее бэкапа через System tuner. Сохраняем этот бэкап на SD карточке и «в облаке» — чтобы «не дай Бог не потерять» и иметь возможность ее поставить быстро назад, если «вдруг таки понадобится». И деинсталируем. Для этого в System Tuner, нажимаем «кнопочку» «System» (с красным андроидом), ищем в списке FM радио, нажимаем кнопку «backup». Делаем копию папки «pmw» (здесь сохраняются бэкапы сустем тюнера), в облаке. или в другом «безопасном и доступном месте». Снова идем на вкладку «System» в System Tuner, и жмем «Uninstall».
Вариант 2 — без деинсталяции, радио остается рабочим — вносим изменения в build.prop. Заходим в System Tuner, Кнопка «Build». Ищем там запись «fmradio.driver.enable», изменяем ее значение на «0» вместо «1» (не забудьте перед этим нажать кнопочку Backup). Перезагружаем. телефон перезагрузится дважды. Первый раз загрузившись, повисит с минуту, потом перезагрузится — не пугайтесь. Теперь «радио» не будет стартовать «само собой» и будет занимать место в памяти, только если Вы им воспользуетесь. В этом варианте. программа приемника не запускается сама по себе. Но если его включили, то уже никакими «убивалками» от него в памяти не избавитесь — перестанет занимать ОЗУ, только после перезагрузки.

Google Talk (Hangouts). Тоже висит в памяти постоянно, даже если Вы убрали его из «автозапуска». сли Вы им не пользуетесь, или пользуетесь редко — «замораживаем». В System Tuner, идем в «системные», находим там «Google Talk», и жмем кнопку «Freeze». Если Вам нужно будет воспользоваться этой программой, то идем туда-же, жмем «Boil» и она снова доступна. Единственный недостаток — после «Freeze»- «Boil» пропадает ярлык соответствующей программы на рабочем столе (Holo launcher). Поэтому запускать ее придется либо через список всех программ, либо послее размораживания — прямо из System Tuner (кнопка с логотипом запускаемой программы, когда она выбрана в списке). Это еще 15 мегабайт сохраненного ОЗУ.

Читайте также:  Альтернатива ватсап для андроид

Галерея — постоянно висит в памяти, занимая

20 мегабайт ОЗУ, самозапускается, даже если Вы ее в данный момент не исползуете, и висит там до перезагрузки. Рекомендую поставить более удобную QuickPic (https://play.google.com/store/apps/details?id=com.alensw.PicFolder&hl=ru), а саму «Галерею» — заморозить.

Синхронизация закладок Google. Если Вы не используете на основной машине браузер Хром, и Вам не нужна синхронизация закладок внутреннего браузера андроид и «Хрома» — совершенно Вам не нужна. занимает 15-20 мегабайт ОЗУ, при чем вдобавок, иногда «висит в памяти в двух экземплярах». Можно «заморозить». но спасет только частично — будет висеть «в одном экземпляре». Можете время от времени убивать через OSmonitor — запускается потом не сразу, в отличие от FM радио, но все ранво запускается. да и морочно так «возюкаться» с ненужной по сути программой. Поэтому — деинсталируем, по той же процедуре, что описана выше для «FM радио».
Вариант 2 — без деинсталяции. — Почему 2 — потому что опробован позже — это дополнение. Просто отключаем в настройках синхронизации синхронизацию закладок (заодно контактов и календаря). Это полностью «самозапуска» не исключит, но он станет много много реже, и по сути нужного нам результата мы добьемся по экономии памяти. Плюс, можно иногда заходить в настройки синхронизации Андроида, включить, подождать пока синхронизируется — выключить. Это не только память сэкономит но и трафик с батареей.

Также постоянно висит в памяти приложение «Карты» — не зависимо от того, пользуетесь Вы навигацией, или нет. Я пользуюсь, поэтому оставил их жить 🙂

Network Diagnose Tool тольком описание зачем она не нашел. Вроде бы для диагностики сети через «инженерное меню». То есть по сути, когда Вы не пользуетесь «Инженерным меню», она вроде как и не нужна. Но в памяти висит постоянно, «выкушивая» более 10 метров ОЗУ. Замораживаем. Если собираетесь пользоваться «инженерным меню», перед заходом туда, можно разморозить. Никаких «побочных эффектов» в работе аппарата после ее «замораживания» я не обнаружил.

Источник

Как на Android проверить расход оперативной памяти

У современных Android-смартфонов уже давно нет проблем с оперативной памятью. Постепенно стало нормой, чтобы аппарат имел 8 и даже 12 ГБ. В принципе, бывает и больше, но даже самые отъявленные гики пока не представляют, куда можно применить такой большой объём ОЗУ. Всё-таки для стабильной работы устройству редко требуется больше 5-6 ГБ, а то, что остаётся, — остаётся просто про запас на случай, если в каком-то приложении произойдёт сбой и оно начнёт расходовать оперативку как не в себя. Но как узнать, куда уходит оперативная память, если в Android нет штатного инструмента проверки её потребления?

Заметили перерасход оперативной памяти? Возьмите и проверьте, куда она уходит

На самом деле такой инструмент есть, просто он скрыт от рядовых пользователей и доступен только разработчикам. То есть устанавливать какое-то приложение для этого не потребуется. В конце концов, полагаться в таких вопросах на сторонний софт было бы слишком опрометчиво, учитывая, что зачастую его созданием занимаются энтузиасты, которые мало что смыслят в разработке и инженерных тонкостях, а просто пробуют свои силы.

Как включить меню разработчика на Android

Чтобы получить доступ к инструменту для контроля расхода оперативной памяти, вам сначала потребуется получить права разработчика и открыть соответствующий раздел настроек.

  • Для этого перейдите в «Настройки» и откройте пункт «О телефоне»;
  • В открывшемся окне найдите строку «Номер сборки»;

Получить права разработчика проще, чем кажется

  • Быстро нажимайте на неё 5-10 раз до тех пор, пока на экране не появится надпись «Вы стали разработчиком»;
  • Подтвердите получение статуса разработчика вводом пароля доступа.

С этого момента в меню «Настроек» вы увидите новый раздел «Для разработчиков». Как правило, он располагается в самом низу, рядом с разделами «Обновление ПО» и «О телефоне». Однако некоторые производители намеренно убирают этот пункт из видимой части и внедряют его в качестве подпункта в какую-то вкладку. Поэтому, если вы не можете найти раздел «Для разработчиков», воспользуйтесь поиском, который встроен в приложение «Настройки». Это самый верный способ отыскать искомый пункт меню.

Какие приложения расходуют оперативную память

А теперь перейдём к инструменту контроля расхода оперативки. Чтобы получить к нему доступ, потребуется проделать следующие шаги:

  • Перейдите в меню «Для разработчиков»;

В меню разработчика скрыт инструмент слежения за расходом оперативной памяти

  • Пролистайте вниз до раздела «Работающие приложения»;
  • Здесь вы увидите сводку о расходе памяти системой и установленным софтом.

Однако, если вы посмотрите на список процессов, которые используют ОЗУ, вы не увидите ни одного приложения. А всё потому, что здесь фигурирует только системный софт, отключение которого может быть чревато сбоями и ухудшением работы операционной системы. Поэтому нам надо переключиться на раздел, в котором указывается расход сторонних приложений. Для этого нужно нажать на иконку шестерёнки в правом верхнем углу. Это действие перенесёт вас на такую же страницу, но уже со списком всех запущенных сторонних приложений, использующих оперативку.

Читайте также:  Самая лучшая метла для андроид

Слева — расход ОЗУ системным софтом, справа — сторонним

Скорее всего, все приложения, кроме «Настроек», будут обозначены как «Кэшированный фоновый процесс». Это значит, что приложение хоть и расходует ресурс, но находится в фоновом режиме и не активничает в данный момент. Нормальный расход памяти для среднестатистического приложения – 100-300 МБ. Тяжёлые игры могут потреблять и 1, и даже 2 ГБ. Таким образом, кстати, очень легко вычислить приложения-шпионы, рекламные вирусы и им подобную шелуху, которая не засыпает, а продолжает прокручивать рекламу или вести сбор данных о пользователе.

Если вы увидели, что какое-то приложение потребляет слишком много ресурсов, его можно остановить или удалить. Софт, которому вы доверяете, можно просто перезагрузить или попробовать установить обновление. В конце концов, разработчики могут и ошибиться при написании кода. А вот если приложение, которое расходует 500-700 МБ или больше, вам незнакомо, его лучше сначала остановить, а потом удалить, чтобы сберечь ресурс смартфона и обеспечить ему более плавное функционирование без сбоев и случайных вылетов запущенных в фоне приложений.

Источник

Большие требования к памяти в 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 этой программы. Можно (и следует) интегрировать ее уже сегодня, тем более, что это не сложно!

Читайте также:  Удалить почтовый ящик mail ru с андроида

Особенно легко спровоцировать утечки памяти, работая со сложными жизненными циклами активностей или фрагментов 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() представления. В таком случае быстро создается много объектов, и может начаться сборка мусора, которая может негативно повлиять на работу этого представления. Как указывалось выше, всегда нужно отслеживать использование памяти, чтобы избегать таких ситуаций.

Источник

Оцените статью