Что такое большая куча Android

Обновлено: 30.09.2022

По умолчанию установлено значение true , что означает, что после того, как приложение завершит обработку своих данных во время полного восстановления системы, оно будет закрыто. андроид: большая куча. Должны ли процессы вашего приложения создаваться с большой кучей Dalvik. Это относится ко всем процессам, созданным для приложения.

Как мне добавить largeHeap на мой Android?

Вы не можете динамически увеличивать размер кучи. Но одним из немедленных решений для работы с большими требованиями к памяти является запрос большой кучи Dalvik для вашего приложения. Вы можете сделать это, добавив android:largeHeap="true" в свой тег в AndroidManifest.

Что такое файл манифеста в Android?

Манифест Android — это XML-файл, содержащий важные метаданные о приложении Android. Сюда входят имя пакета, имена действий, основное действие (точка входа в приложение), поддержка версии Android, поддержка аппаратных функций, разрешения и другие конфигурации.

Какой максимальный объем оперативной памяти может использовать приложение?

На ранних устройствах Android максимальный размер приложения составлял 16 МБ. Позже это ограничение было увеличено до 24 МБ или 32 МБ.

Что такое Android использует CleartextTraffic true?

В Android 6.0 появился атрибут useCleartextTraffic в элементе приложения в манифесте Android. Значение по умолчанию в Android P — «false». Значение true указывает, что приложение намерено использовать чистый сетевой трафик.

Что делает Android, использующий CleartextTraffic?

Как сделать мои приложения для Android постоянными?

Как включить постоянное приложение в Android Follow

  1. Вам нужно будет нажать и удерживать значок с вашими инициалами или изображением вашего профиля, в данном случае с надписью BTS, пока на экране не появится сообщение «Настройки отладки включены».
  2. На этом экране нажмите ссылку «Питание», чтобы открыть следующее меню:

Какие два типа намерений существуют в Android?

В Android существует два типа намерений: неявные и . Явный.

Как очистить оперативную память на телефоне Android?

5 лучших способов очистить оперативную память на Android

  1. Проверьте использование памяти и закройте приложения.
  2. Отключить приложения и удалить вирусы.
  3. Отключить анимацию и переходы.
  4. Не используйте живые обои или обширные виджеты.
  5. Используйте сторонние приложения Booster.

Сколько оперативной памяти используют приложения Android?

Приложения могут потреблять от 100 МБ до 1,2 ГБ ОЗУ. Средний пользователь смартфона может и не быть мобильным игроком, но это не значит, что используемые им приложения не потребляют много оперативной памяти.

Хорошо ли использовать largeheap на Android?

Не рекомендуется использовать android:largeHeap="true" вот выдержка из Google, которая объясняет это. Однако возможность запрашивать большую кучу предназначена только для небольшого набора приложений, которые могут оправдать необходимость потребляют больше оперативной памяти (например, большое приложение для редактирования фотографий).

Когда запрашивать большую кучу в Android?

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

Что является примером большой кучи?

Приложения запускаются с 2 МБ, а максимальное выделение, помеченное как «largeHeap», ограничено 36 МБ (в зависимости от конкретной конфигурации устройства). Примерами приложений с большой кучей являются фото- и видеоредактор, камера, галерея и главный экран.

Когда использовать флаг largeheap в Android?

Нет четкого определения необходимости использования этого флага. Если вам нужно больше памяти — Android предоставляет вам инструмент для ее увеличения. А вот необходимость использования вы определяете сами. Если вам необходимо использовать (и сохранять) большой объем памяти, то да, вы можете и должны использовать android:largeHeap="true".

Какова цель bigheap в Android?

На самом деле android:largeHeap — это инструмент для увеличения памяти, выделенной для приложения. Нет четкого определения необходимости использования этого флага. Если вам нужно больше памяти — Android предоставляет вам инструмент для ее увеличения. А вот необходимость использования вы определяете сами.

Как увеличить размер кучи приложения Android?

Например, мой планшет Samsung Galaxy Tab 8.9 P7310 может занимать 64 МБ памяти. Есть ли способ увеличить этот размер памяти, которую может использовать приложение? Вы можете использовать android:largeHeap="true" для запроса большего размера кучи, но это не будет работать ни на каких устройствах до Honeycomb.

Нет четкого определения необходимости использования этого флага. Если вам нужно больше памяти — Android предоставляет вам инструмент для ее увеличения. А вот необходимость использования вы определяете сами. Если вам необходимо использовать (и сохранять) большой объем памяти, то да, вы можете и должны использовать android:largeHeap="true".

Что является примером приложения с большой кучей?

Примерами приложений с большой кучей являются Photo/Video Editor, Camera, Gallery и Home Screen. Android хранит фоновые процессы приложений в кэше LRU. Когда системе не хватает памяти, она останавливает процессы в соответствии со стратегией LRU, но также учитывает, какое приложение потребляет больше всего памяти.

 Иллюстрация: Работа с большими требованиями к памяти на Android

Эта статья посвящена основным методам управления использованием памяти в приложениях, таких как веб-браузеры, фоторедакторы и программы просмотра PDF, которые требуют больших объемов памяти.

Сначала немного теории

Большинство приложений для Android работают поверх среды выполнения Android (ART), которая пришла на смену устаревшей виртуальной машине Dalvik. ART и Dalvik похожи на виртуальную машину Java (JVM) в том, что они разделяют лежащие в их основе принципы проектирования: они используют два отдельных пространства памяти для хранения данных приложения — стек и кучу.

Память стека

Память стека Java используется для хранения локальных переменных (примитивных типов и ссылок на объекты). Каждый поток Java имеет свой отдельный стек. Память стека относительно мала по сравнению с памятью кучи. Размер стека Java в Dalvik обычно составляет 32 КБ для кода Java и 1 МБ для собственного (C++/JNI) кода. ART представила единый стек для Java и C++ размером около 1 МБ.

Когда приложение достигает предела памяти стека, выдается StackOverflowError. Наиболее вероятной причиной достижения предела стека является либо бесконечная рекурсия, либо чрезмерно глубокий вызов метода. Память стека всегда используется по принципу LIFO (последний вошел, первый вышел). Всякий раз, когда выполняется вызов метода, в стек помещается новый блок (кадр стека) с локальными переменными метода. Когда метод завершается, его кадр стека извлекается из стека, а любое возможное значение результата помещается обратно в стек. Бесконечная рекурсия или чрезмерно глубокая иерархия вызовов приведут к превышению предела размера стека. Первая проблема — это ошибка, которую можно легко исправить, а вторая требует некоторого рефакторинга в виде разворачивания рекурсивных вызовов методов в цикл.

Куча памяти

Память кучи Java используется виртуальной машиной для размещения объектов. Всякий раз, когда вы создаете объект, он всегда создается в куче. Виртуальные машины, такие как JVM или ART, выполняют регулярную сборку мусора (GC), делая память кучи всех объектов, на которые больше нет ссылок, доступной для будущих выделений.

Чтобы обеспечить удобство работы пользователей, Android устанавливает жесткие ограничения на размер динамической памяти для каждого работающего приложения. Ограничение размера кучи зависит от устройства и зависит от объема оперативной памяти устройства. Если ваше приложение достигнет этого предела кучи и попытается выделить больше памяти, оно получит OutOfMemoryError и прекратит работу. Итак, давайте рассмотрим некоторые методы предотвращения этой ситуации.

Анализ динамической памяти

Самым важным инструментом для изучения проблем с памятью в ваших приложениях и понимания того, как используется память, является профилировщик памяти, доступный в Android Studio.

Этот инструмент обеспечивает визуализацию того, сколько памяти занимает ваше приложение с течением времени. Вы можете делать снимки кучи Java запущенного приложения, записывать выделения памяти и проверять кучи или записанные выделения памяти в мощном пользовательском интерфейсе.

Ваш типичный сеанс профилировщика памяти должен выглядеть следующим образом:

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

Просматривайте использование памяти с течением времени, особенно после операций, которые, как известно, требуют выделения большого объема памяти. Убедитесь, что использование памяти снижается после выполнения этих операций. Например, ниже вы можете увидеть влияние PdfActivity PSPDFKit на память после загрузки документа.

Скриншот пиков профилировщика памяти

Создавайте дамп кучи в нескольких точках среды выполнения вашего приложения, чтобы проверить использование памяти. Ищите большие объекты, которые хранятся в памяти и защищены от сборки мусора. Дампы кучи также могут помочь в выявлении утечек памяти — например, вы можете искать свои действия в дампе кучи, чтобы узнать, были ли собраны старые экземпляры.

В PSPDFKit мы широко используем профилировщик памяти для выявления проблем с использованием памяти при работе со сложными документами. Мы также регулярно используем его, чтобы быстро понять, насколько большой объем памяти мы представляем с нашими новыми функциями или различными рефакторингами (мы всегда балансируем использование памяти и производительность).

Утечки памяти

Сегодняшние сборщики мусора — это сложные элементы современной технологии, результат многолетних исследований и разработок бесчисленного количества людей, от ученых до профессионалов в области разработки. Однако нам все равно нужно позаботиться о том, чтобы избежать утечек памяти.

Отраслевым стандартом для обнаружения утечек памяти является библиотека LeakCanary. Он автоматически показывает уведомления, когда в ваших сборках для разработки обнаруживается утечка памяти, предоставляя вам трассировку стека утечки в своем пользовательском интерфейсе. Вы можете (и должны) легко интегрировать его сегодня!

Введение новых утечек памяти особенно просто при работе со сложными жизненными циклами действий или фрагментов Android. Это обычное явление в местах, где разработчики содержат сильные ссылки на контексты пользовательского интерфейса или другие объекты, специфичные для пользовательского интерфейса, в фоновой задаче или в своих статических переменных. Один из способов вызвать такие утечки — несколько раз повернуть устройство во время тестирования приложения.

Освобождение памяти в ответ на события

Android может освободить память вашего приложения или полностью закрыть его, когда необходимо освободить память для более важных задач. Прежде чем это произойдет, система дает вам возможность освободить любую память, которая вам не нужна. Вам нужно будет реализовать интерфейс ComponentCallbacks2 в вашей деятельности. Затем всякий раз, когда системе не хватает памяти, вы получите вызов метода onTrimMemory() и сможете освободить память или отключить функции, которые не будут работать в таких ситуациях с нехваткой памяти.

PSPDFKit также обрабатывает эти обратные вызовы. Мы разработали PSPDFKit, чтобы использовать много памяти для кэширования, чтобы мы могли сделать работу более плавной. Мы не знаем, сколько памяти доступно на устройстве, поэтому PSPDFKit адаптируется и ограничивает использование, когда мы получаем уведомления о нехватке памяти. Это позволяет запускать приложения на основе PSPDFKit даже на слабых устройствах, хотя и с меньшей производительностью из-за отключенного кэширования.

Большая куча

Одним из немедленных решений, позволяющих справиться с большими требованиями к памяти, является запрос большой кучи Dalvik для вашего приложения. Вы можете сделать это, добавив android:largeHeap="true" в свой тег в AndroidManifest.xml

Если для свойства largeHeap задано значение true , Android создаст все процессы для вашего приложения с большой кучей. Этот параметр предназначен только для приложений, которые не могут работать без него из-за своей природы, то есть они используют большие ресурсы, которые должны одновременно помещаться в память. Настоятельно рекомендуется не использовать большую кучу только для того, чтобы увеличить использование памяти. Вы всегда должны оптимизировать использование памяти, потому что большая куча на недорогих устройствах с малым объемом памяти может быть слишком мала для вашего приложения.

Проверка объема памяти, который может использовать ваше приложение

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

Android поддерживает устройства с оперативной памятью от 512 МБ. Убедитесь, что вы помните и недорогие устройства! Вы можете проверить, работает ли ваше приложение на устройстве с малым объемом памяти, с помощью метода isLowRamDevice(). Точное поведение этого метода зависит от устройства, но обычно он возвращает true на устройствах с оперативной памятью менее 1 ГБ. Вы должны убедиться, что ваше приложение правильно работает на этих устройствах, и отключить все функции, требующие большого объема памяти.

Подробнее о том, как Android ведет себя на устройствах с малым объемом памяти, а также некоторые дополнительные советы по оптимизации памяти для них, можно прочитать здесь.

Используйте оптимизированные структуры данных

Во многих случаях приложения используют слишком много памяти просто потому, что используют неоптимальные структуры данных.

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

К другим неэффективным для памяти структурам данных относятся различные сериализации. Хотя форматы XML или JSON действительно просты в использовании, использование более эффективного двоичного формата, такого как буферы протоколов, приведет к меньшему использованию памяти.

Эти примеры структур данных, оптимизированных для памяти, даны только в качестве подсказки. Как и при любом рефакторинге, вы должны сначала найти источник своих проблем, прежде чем приступать к оптимизации производительности.

Предотвратить отток памяти

Виртуальные машины Java/Android очень быстро выделяют объекты. Сбор мусора тоже довольно быстрый. Однако выделение большого количества объектов за небольшой промежуток времени может привести к проблеме, называемой оттоком памяти. В таком случае виртуальная машина и сборщик мусора не выдерживают таких частых выделений, и приложение замедляется или, в крайних случаях, попадает в ситуацию нехватки памяти.

Основная проблема для нас в мире Android заключается в том, что мы не можем контролировать время выполнения GC. Это потенциально может привести к проблемам с производительностью — например, если GC запускается во время анимации пользовательского интерфейса, и мы пропускаем порог в 16 мс для плавного рендеринга кадров. Таким образом, важно предотвратить чрезмерное выделение памяти в нашем коде.

Одним из примеров ситуации, которая приводит к нехватке памяти, является выделение больших объектов, таких как Paint, внутри метода onDraw() представления. Это быстро создает множество объектов и может привести к сборке мусора, что негативно скажется на производительности представления. Вы всегда должны внимательно следить за использованием памяти, чтобы предотвратить такие ситуации.

Оптимизация использования памяти PSDFKit

Мы в PSPDFKit создали SDK, который может работать с очень сложными документами. Поскольку рендеринг PDF-файлов требует большого объема памяти, мы должны быть особенно осторожны, чтобы убедиться, что приложения, использующие PSPDFKit, не превысят лимиты памяти Android, что приведет к тому, что приложение будет уничтожено ОС.

У нас есть подробное руководство, в котором перечислены большинство приемов, описанных в этой статье, в контексте приложений на основе PSPDFKit. Если вы интегрируете PSPDFKit, я настоятельно рекомендую вам ознакомиться с ним.

Заключение

Оперативная память (ОЗУ) может быть довольно ограничена на мобильных устройствах. Убедиться, что вы используете его эффективно, особенно важно при создании приложений, которые работают с большими объектами, такими как большие растровые изображения (средства просмотра PDF, веб-браузеры, фоторедакторы) или большие медиафайлы (аудио- или видеоредакторы). Советы из этой статьи необходимы каждому разработчику, который хочет создавать качественные приложения с приемлемым поведением даже на устройствах с малым объемом памяти.

Я надеюсь, что вы не увидите в своих приложениях сбоев, связанных с памятью. Удачного кодирования!

Текст был успешно обновлен, но возникли следующие ошибки:

pranavgupta1234 изменил заголовок плюсы и минусы удаления «largeHeap = true» из манифеста Android 22 марта 2017 г.

yanokwa прокомментировал 22 марта 2017 г.

@pranavgupta1234 Поищите в истории git и узнайте, какая фиксация добавила largeHeap. Есть ли в этом комментарии комментарий, объясняющий, почему он был добавлен?

прокомментировал batkinson 22 марта 2017 г.

@pranavgupta1234, как сказал Йоу, вероятно, хочет посмотреть на причины изменения. В данном случае похоже, что это было сделано не зря. Однако мне интересно, останется ли интерпретация и причина прежними, когда мы повысим версию API до 16+?

pranavgupta1234 прокомментировал 22 марта 2017 г. •

Я также не слишком уверен (требуется исследование), также в документе Android говорится:
android:largeHeap
Должны ли процессы вашего приложения создаваться с большой кучей Dalvik. Это относится ко всем процессам, созданным для приложения. Это относится только к первому приложению, загруженному в процесс; если вы используете общий идентификатор пользователя, чтобы разрешить нескольким приложениям использовать процесс, все они должны использовать этот параметр последовательно, иначе результаты будут непредсказуемыми.

yanokwa прокомментировал 22 марта 2017 г.

укажите атрибут 'largeHeap', чтобы ODK Collect мог работать с большей кучей (включая стек) на некоторых устройствах (в зависимости от производителя оборудования). Может включать более сложные функции regex().

Я предполагаю, что largeHeap=true необходим, поскольку базовой библиотеке JavaRosa может не хватать памяти со сложными формами.

@pranavgupta1234 Если вы хотите удалить это, нам понадобится форма с этой проблемой. Один с большим количеством функций регулярных выражений, работающих на эмуляторе с низким объемом памяти, может вызвать проблемы с памятью, которые решает largeHeap. Может быть полезно поискать в списках рассылки ODK.

В качестве альтернативы, @mitchellsundt, у вас есть форма (или вы знаете, как мы можем создать форму), которая вызывает эту проблему?

Если мы не можем воспроизвести первоначальную проблему, моя интуиция подсказывает, что мы должны оставить это в покое.

прокомментировал batkinson 22 марта 2017 г.

Поэтому я не уверен, использовались ли тестовые примеры для проверки исходной решаемой проблемы. Если есть конкретные примеры больших форм, которые мы хотим поддерживать, было бы неплохо использовать профилировщик памяти, чтобы посмотреть, где фактически связана память. Часто, особенно когда люди не измеряют фактический профиль памяти регулярно, вы можете добиться значительных улучшений, не прибегая к ядерной опции (например, largeHeap).

Ха-ха, @yanokwa меня опередил.

yanokwa прокомментировал 22 марта 2017 г.

yanokwa прокомментировал 29 марта 2017 г.

@pranavgupta1234 Хотите взять это на себя?

pranavgupta1234 прокомментировал 29 марта 2017 г.

Конечно, @yanokwa, я попробую :)

wbrunette прокомментировал 29 марта 2017 г.

Подтверждаю @yanokwa: «Я предполагаю, что largeHeap=true необходим, потому что базовая библиотека JavaRosa может исчерпать память со сложными формами». Люди со сложными формами (например,500+ вопросов, у некоторых людей более 1000 форм вопросов) может закончиться память с JavaRosa, largeHeap позволяет больше памяти для процесса на мобильном устройстве. К сожалению, JavaRosa написана неэффективно с точки зрения использования памяти, поскольку все хранится в памяти.

Параметры памяти настраиваются для каждого устройства в Dalvik. Существует множество настроек для каждого устройства в зависимости от ОС (например, dalvik.vm.heapsize, dalvik.vm.heapgrowthlimit).

grzesiek2010 прокомментировал 21 апреля 2020 г.

Это был один из моментов, о которых мы упоминали при планировании версии 1.27, поэтому я исследовал проблему и вот мои выводы:
Я использовал Samsung Galaxy S4 с Android 5 и форму с несколькими вопросами на одном экране с изображениями. например:
images4.xlsx

с помощью largeHeap="true" я смог открыть форму, содержащую до 90 вопросов, а не только 20.
Выбор одного или нескольких вопросов работает намного лучше, потому что эти виджеты используют RecyclerView, поэтому без largeHeap="true" Я смог открыть вопрос со 100 вопросами, и, вероятно, сработало бы и больше. Во время прокрутки может произойти сбой, но только иногда, и его нелегко воспроизвести.

Мой вывод состоит в том, что удаление этого флага без улучшений в сборе немного опасно.


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

Ребята, вы использовали большие кучи в своих приложениях и что вы заметили? Могу ли я использовать большую кучу только в одном действии, а не во всем приложении?

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

Изменить 2: Спасибо всем за предложения, вы дали мне множество идей, чтобы попробовать.


Сжатие формата файла не помогает снизить нагрузку на оперативную память. Сжатые файлы раздуваются системой, загружаются и сохраняются в виде необработанных пикселей в ОЗУ.

Я полагаю, что изображение в формате 1440p займет 10 МБ оперативной памяти независимо от того, используете ли вы .webp или .jpg

Вы можете попробовать выполнить загрузку с использованием RGB_565, чтобы уменьшить занимаемое пространство. Также попробуйте уменьшить разрешение изображения или использовать вектор, если можете.

Если ваша «адаптация» уже использует слишком много памяти, значит, с вашим приложением что-то не так. Вы пробовали проверить его на наличие утечек?

Вы обвиняете размер изображения в использовании памяти. Являются ли ресурсы изображения, необработанные файлы или из сети? Если это не ресурсы, посмотрите на Glide или Picasso. Они решают проблемы с памятью за вас и очень интуитивно понятны в использовании. Если это ресурсы, то либо вы ошибаетесь, они огромны, либо вы делаете что-то неподдерживаемое (на ум приходят векторные изображения с вспомогательными библиотеками). Вы запускали профайлер?

Да, и я сузил проблему до изображений в моем слайд-шоу. В остальном приложение в порядке.

это бессмысленно, после декодирования в растровое изображение имеет значение только размер в пикселях.
Независимо от того, является ли источником полностью черное изображение размером 1 КБ или полноформатное изображение размером 1 месяц, растровое изображение 1000 * 1000 займет одинаковое место в память.

Вы смотрели, что занимает память вашего приложения?
OOM всегда будет происходить из-за растровых изображений, поскольку они являются вашими самыми большими объектами (по статистике, при попытке выделить один из них вы получите сообщение об ошибке) но основная причина может быть совсем другой.

Если это исходит из ваших изображений, используйте кэширование (есть библиотеки вроде Glide, если вы не хотите делать это вручную) и удалите растровое изображение из памяти, как только оно перестанет отображаться.

Вам не обязательно хранить в памяти все 5 изображений Viewpagers.

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

Читайте также: