当我有很多可用空间时,我得到OutOfMemory。我不明白为什么。在我的应用程序中,我有一个简单的流程:
导航到“拍照”功能
拍照并显示缩略图
调整尺寸并保存拍摄的照片(在没有Picasso帮助的情况下调整尺寸)
重复2和3几次
通过网络发送拍摄的照片。
下面显示了以下步骤的内存使用图。一切正常。没有发生内存不足。
但是我注意到了一件事。流程:
在“拍照”功能之前,我有一个菜单。当我不断切换屏幕方向时,内存使用量会增加(每个开关约2MB)。
拍照并显示缩略图。已拍摄照片,但毕加索没有显示缩略图。我看到Picasso可以很好地处理OutOfMemory,并且不会停止应用程序。 java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeStream
调整大小和保存会导致相同的OutOfMemory(java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeStream
)并停止应用程序
在第一张图上,我看到“图片处理”大约需要20MB。在第二张图上,我看到有超过20MB的可用空间,但是出现了OutOfMemory。为什么?收集来自切换方向的垃圾。
最佳答案
在第二张图上,我看到有超过20MB的可用空间,但是出现了OutOfMemory。为什么?
由于您没有足够的可用内存块来处理任何分配失败的问题,并且您已经达到了堆限制,因此Android无法进一步扩展堆。
在普通Java中,垃圾收集器是一个“移动”收集器,该收集器将在堆中移动对象以合并空闲的内存块。因此,当您尝试分配某些内容而分配失败时,实际上您的内存不足。
总体而言,Android不会使用移动的收集器,因为这会占用过多的CPU时间并损害用户体验。因此,您的堆空间可能变得碎片化。您可能有很多可用的堆空间,但是它们都小于所需的分配。
(Android 5.0及更高版本例外,当您的应用在后台运行时,ART将使用移动的收集器)