调整图像大小时的OutOfMemory

时间:2016-02-10 13:42:43

标签: java android image android-layout garbage-collection

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

  1. 导航到"拍照"功能
  2. 拍照并显示缩略图
  3. 调整大小并保存拍摄的照片(调整不用毕加索帮助)
  4. 重复2次和3次
  5. 通过网络发送拍摄的照片。
  6. Bellow显示了上述步骤的内存使用图。一切都很完美。没有OutOfMemory。

    enter image description here

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

    1. 就在拍摄照片之前#34;功能我有一个菜单。当我不断切换屏幕方向时,内存使用量会增加(每个交换机大约2MB)。
    2. 拍照并显示缩略图。照片拍摄但毕加索并没有显示缩略图。我看到Picasso很好地处理了OutOfMemory并且没有停止应用程序。 java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeStream
    3. 调整大小并保存导致相同的OutOfMemory(java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeStream)并停止应用程序
    4. 在第一张图中我看到"图片处理"需要大约20MB。在第二个图表中,我看到有超过20MB的空闲,但OutOfMemory发生。为什么?收集切换方向的垃圾。

      enter image description here

1 个答案:

答案 0 :(得分:2)

  

在第二张图中,我看到有超过20MB的空闲,但OutOfMemory发生了。为什么?

因为你没有足够的空闲内存来处理任何失败的分配,并且你已达到堆限制,所以Android无法进一步扩展堆。

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

总的来说,Android并没有使用移动收集器,因为它占用了太多的CPU时间并损害了用户体验。因此,您的堆空间可能会碎片化。您可能有很多可用堆空间,但它们都比您想要的分配小。

(例外是在Android 5.0+上,而你的应用程序在后台,ART将使用移动的收藏家)