为什么Android在加载图像时会分配比所需更多的内存

Sim*_*mon 11 android memory-management heap-dump

伙计们,我不认为这是重复的,也不是其中一个我如何避免OOM问题.这是对知识的真正追求,所以推迟那些投票请...

想象一下,我有一个JPEG500x500像素.我把它加载ARGB_8888为" bad as it gets".

我希望Android可以分配,500x500x4 bytes = a little under 1MB但是看看堆转储,你会看到Android分配的5-10次数要多得多,通常是时间的因素.

您经常在这里看到有关OOMS的问题,其中堆栈跟踪显示a heap request of say 15MB并且它总是比仅仅保存图像的字节所需的大得多.OP通常会捕获一些downvotes然后被库存答案和关于使用更少内存(感谢Romain!)和缩放的评论轰炸.我认为这里有更多的东西.

谁知道为什么会这样?

如果没有明显的答案,如果有帮助,我会组建一个SSCCE.

PS.我认为JPEG与PNG等是无关紧要的,因为我们讨论的是后备位图的内存使用量,这只是x乘以BPP的x倍 - 或者我是否很慢?

vog*_*tix 1

获取内存池或内存块并将其分配为更小的请求曾经是内存管理的一个常见技巧。当我使用嵌入式系统时,维护不同大小的内存池是一种常见的做法,我们只是分配一个大于池请求量的块。这是防止过多内存碎片的便捷方法。也许这正发生在这里。