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

Мне очень интересен этот вопрос относительно управления памятью операционной системы Android, поэтому я надеюсь на довольно подробный ответ на эту тему.

Что я хотел бы знать:

  • Что такое максимальный объем памяти мегабайтах/as процент от общей ОЗУ), который может использовать приложение Android (это не системное приложение)?
  • Существуют ли различия между версиями Android?
  • Существуют ли какие-либо отличия в отношении производителя устройства?

И самое главное:

  • Какие "боковые факторы" учитываются / , что зависит от, когда дело доходит до системы, определяющей, сколько ОЗУ приложение может использовать во время выполнения (при условии, что что максимум памяти для каждого приложения не является статическим числом)?

То, что я слышал до сих пор (до 2013 года):

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

Что мне очень любопытно:

Оба этих предела очень низкие.

Недавно я загрузил "Диспетчер задач Android" , чтобы проверить оперативную память устройств. Я заметил, что есть приложения, использующие около 40-50 мегабайт оперативной памяти, что является obvioulsy больше, чем упомянутое максимальное использование ОЗУ, скажем, 32 МБ. Итак, как Android определяет, сколько оперативной памяти может использовать приложение? Как возможно, что приложения превышают этот предел?

Кроме того, я заметил, что некоторые приложения моей аварии (убитые системой?) с OutOfMemoryException при использовании около 30-40 мегабайт. С другой стороны, у меня есть приложения, запущенные на моем телефоне, используя 100 МБ и более через некоторое время (возможно, из-за утечек памяти), которые не сбой или не уничтожаются. Таким образом, , очевидно, также зависит от самого приложения, когда дело доходит до определения того, сколько ОЗУ можно будет сэкономить. Как это возможно? (Я провел тесты с HTC One S с ОЗУ 768 МБ)

Заранее благодарю за ваше объяснение.

Отказ от ответственности: я НЕ СВЯЗАН с Android Task Manager.

Ответ 1

Каков максимальный объем памяти (в мегабайтах/в процентах от общей ОЗУ), который может использовать приложение Android (не системное приложение)?

Это зависит от устройства. getMemoryClass() on ActivityManager даст вам значение для устройства, на котором работает ваш код.

Существуют ли различия между версиями Android?

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

Существуют ли различия в изготовителе устройства?

Да, поскольку производители производят устройства, а размер зависит от устройства.

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

Я не знаю, что означает "боковые факторы".

У ранних устройств была кеп-кеп на 16 МБ; Более поздние устройства увеличили это до 24 МБ или 32 МБ

Что о правильном. Разрешение экрана является значительной детерминантой, поскольку большие разрешения означают большие растровые изображения, и поэтому планшеты и телефоны с высоким разрешением будут иметь более высокие значения. Например, вы увидите устройства с кучей 48 МБ, и я не удивлюсь, если есть значения выше этого.

Как возможно, что приложения превышают этот предел?

Вы предполагаете, что автор этого приложения знает, что он делает. Учитывая, что использование памяти в приложении сложно определить для основного инженера Android, я бы не стал предполагать, что рассматриваемое приложение обязательно обеспечивает особенно точные результаты.

При этом нативный код (NDK) не подпадает под ограничение кучи. И, начиная с Android 3.0, приложения могут запрашивать "большую кучу", как правило, в сотнях диапазонов MB, но это считается плохой формой для большинства приложений.

Кроме того, я заметил, что некоторые приложения моей аварии с OutOfMemoryException при использовании около 30-40 мегабайт.

Помните, что сборщик мусора Android не является сборщиком мусора. Исключение действительно должно быть CouldNotFindSufficientlyLargeBlockOfMemoryException, но это, вероятно, считалось слишком многословным. OutOfMemoryException означает, что вы не смогли выделить запрошенный блок, а не то, что вы полностью исчерпали свою кучу.

Ответ 2

Ограничения по памяти для каждого приложения здесь в зависимости от размера экрана и версии Android: https://drive.google.com/file/d/0B7Vx1OvzrLa3Y0R0X1BZbUpicGc/view?usp=sharing

Источник: Android Compatibility Загрузки http://source.android.com/compatibility/downloads.html; Документ определения совместимости (CDD), раздел "Совместимость виртуальной машины" или "Совместимость времени выполнения"

Ответ 3

Этот ответ углубляется в поведение методов getMemoryClass() и maxMemory().