当我有很多可用空间时,我得到OutOfMemory。我不明白为什么。在我的应用程序中,我有一个简单的流程:


导航到“拍照”功能
拍照并显示缩略图
调整尺寸并保存拍摄的照片(在没有Picasso帮助的情况下调整尺寸)
重复2和3几次
通过网络发送拍摄的照片。


下面显示了以下步骤的内存使用图。一切正常。没有发生内存不足。

java - 调整图像大小时内存不足-LMLPHP

但是我注意到了一件事。流程:


在“拍照”功能之前,我有一个菜单。当我不断切换屏幕方向时,内存使用量会增加(每个开关约2MB)。
拍照并显示缩略图。已拍摄照片,但毕加索没有显示缩略图。我看到Picasso可以很好地处理OutOfMemory,并且不会停止应用程序。 java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeStream
调整大小和保存会导致相同的OutOfMemory(java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeStream)并停止应用程序


在第一张图上,我看到“图片处理”大约需要20MB。在第二张图上,我看到有超过20MB的可用空间,但是出现了OutOfMemory。为什么?收集来自切换方向的垃圾。

java - 调整图像大小时内存不足-LMLPHP

最佳答案

在第二张图上,我看到有超过20MB的可用空间,但是出现了OutOfMemory。为什么?


由于您没有足够的可用内存块来处理任何分配失败的问题,并且您已经达到了堆限制,因此Android无法进一步扩展堆。

在普通Java中,垃圾收集器是一个“移动”收集器,该收集器将在堆中移动对象以合并空闲的内存块。因此,当您尝试分配某些内容而分配失败时,实际上您的内存不足。

总体而言,Android不会使用移动的收集器,因为这会占用过多的CPU时间并损害用户体验。因此,您的堆空间可能变得碎片化。您可能有很多可用的堆空间,但是它们都小于所需的分配。

(Android 5.0及更高版本例外,当您的应用在后台运行时,ART将使用移动的收集器)

09-25 15:51