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

Люди, я не думаю, что это дубликат и НЕ является одним из них, как мне избежать вопросов OOMs. Это настоящий квест для знания, поэтому держись на этих голосах, пожалуйста...

Представьте, что у меня есть JPEG из 500x500 пикселей. Я загружаю его как ARGB_8888, который является "bad as it gets".

Я ожидал бы, что Android выделит 500x500x4 bytes = a little under 1MB, но посмотрите на кучу кучи, и вы увидите, что Android выделяет значительно больше, часто коэффициенты 5-10 раз больше.

Вы часто видите здесь вопросы о OOMS, где трассировка стека показывает heap request of say 15MB, и она Всегда намного больше, чем требуется просто удерживайте байты изображения. OP обычно улавливает некоторые downvotes, а затем обманывает запасные ответы и комментарии об использовании меньше памяти (спасибо Romain!) И в масштабировании. Я думаю, что здесь больше, чем кажется.

Кто-нибудь знает, почему это?

Если нет явного ответа, я соберу SSCCE, если это поможет.

PS. Я предполагаю, что JPEG против PNG и т.д. Не имеет значения, так как мы говорим об использовании памяти обратного растрового изображения, которое просто x раз y раз BPP - или я медленный?

Ответ 1

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