当我有很多可用空间时,我得到OutOfMemory。我不明白为什么。在我的应用程序中,我有一个简单的流程:
Bellow显示了上述步骤的内存使用图。一切都很完美。没有OutOfMemory。
但是我注意到了一件事。流程:
java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeStream
java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeStream
)并停止应用程序在第一张图中我看到"图片处理"需要大约20MB。在第二个图表中,我看到有超过20MB的空闲,但OutOfMemory发生。为什么?收集切换方向的垃圾。
答案 0 :(得分:2)
在第二张图中,我看到有超过20MB的空闲,但OutOfMemory发生了。为什么?
因为你没有足够的空闲内存来处理任何失败的分配,并且你已达到堆限制,所以Android无法进一步扩展堆。
在普通Java中,垃圾收集器是一个“移动”收集器,它将在堆中移动对象以便合并空闲的内存块。因此,当您尝试分配某些内容并且分配失败时,您实际上是内存不足。
总的来说,Android并没有使用移动收集器,因为它占用了太多的CPU时间并损害了用户体验。因此,您的堆空间可能会碎片化。您可能有很多可用堆空间,但它们都比您想要的分配小。(例外是在Android 5.0+上,而你的应用程序在后台,ART将使用移动的收藏家)