Какое максимальное количество ОЗУ может использовать приложение?

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

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

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

и главное:

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

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

  • ранние устройства Android имели крышку для каждого приложения 16 МБ
  • позже эта крышка увеличилась до 24MB или 32MB

что делает меня очень любопытно:

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

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

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

заранее спасибо за ваши объяснения.

отказ от ответственности: я никоим образом не связан с Android Task Manager app.

2 ответов


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

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

есть ли какие-либо различия между версиями Android?

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

существуют ли различия в отношении производителя устройства?

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

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

Я понятия не имею, что означает "побочные факторы".

ранние устройства имели per-app крышка 16MB; более поздние устройства увеличили это до 24MB или 32MB

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

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

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

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

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

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


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

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