Java 调整图像大小时内存不足

Java 调整图像大小时内存不足,java,android,image,android-layout,garbage-collection,Java,Android,Image,Android Layout,Garbage Collection,当我有很多空闲空间时,我就会忘记记忆。我不明白为什么。在我的应用程序中,我有一个简单的流程: 导航到“拍照”功能 拍摄照片并显示缩略图 调整大小并保存拍摄的照片(不使用毕加索帮助调整大小) 重复2和3几次 通过网络发送拍摄的照片 下图显示了上述步骤的内存使用图。一切都很完美。没有发生OutOfMemory 但我注意到一件事。A流程: 在“拍照”功能之前,我有一个菜单。当我不断切换屏幕方向时,内存使用量就会增加(每个开关约2MB) 拍摄照片并显示缩略图。这张照片是拍的,但毕加索并没有显示缩略图。

当我有很多空闲空间时,我就会忘记记忆。我不明白为什么。在我的应用程序中,我有一个简单的流程:

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

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

  • 在“拍照”功能之前,我有一个菜单。当我不断切换屏幕方向时,内存使用量就会增加(每个开关约2MB)
  • 拍摄照片并显示缩略图。这张照片是拍的,但毕加索并没有显示缩略图。我看到毕加索很好地处理了OutOfMemory,并且没有停止应用程序<代码>android.graphics.BitmapFactory.NativeDecodeseam上的java.lang.OutOfMemoryError
  • 调整大小并保存会导致相同的OutOfMemory(
    java.lang.OutOfMemory错误,位于android.graphics.BitmapFactory.NativeDecodeseam
    )并停止应用程序
  • 在第一张图上,我看到“图片处理”需要约20MB的时间。在第二张图上,我看到有超过20MB的空闲内存,但发生OutOfMemory。为什么?来自交换方向的垃圾被收集。

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

    因为您没有足够的可用内存块来处理任何分配失败的情况,并且您已经达到了堆限制,所以Android无法进一步扩展堆

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

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


    (Android 5.0+上例外,当你的应用程序在后台时,ART将使用移动收集器)

    查看此blogspot,我能做些什么?我不能只针对Android 5.0+开发应用程序。android:largeHeap=true有帮助,但它是fishy@emstol刘易斯:“那我能怎么办呢?”——这很难说,因为我们没有一个好的解决办法。通常,通过
    BitmapFactory.Options上的
    inBitmap
    重用
    Bitmap
    对象。尽量不要同时在内存中保留一堆位图。确保调整大小的方式能够最大限度地减少堆的使用(例如,主要通过
    BitmapFactory.Options
    上的
    inSampleSize
    ,并通过其他缩放进行微调)。我有一个关于内存管理的建议,可能会有所帮助。