【发布时间】:2014-10-04 06:56:03
【问题描述】:
我正在制作图像库应用程序,其中包含各种分辨率和大小的图像。 根据我的观察,当应用程序尝试加载大图像时,它会抛出 OutOfMemory。
- 如何防止应用程序内存不足?
- 有什么方法可以在应用程序因内存不足而崩溃之前获得通知?
- 我如何知道应用程序将达到堆容量?
【问题讨论】:
标签: android memory-management out-of-memory heap-memory
我正在制作图像库应用程序,其中包含各种分辨率和大小的图像。 根据我的观察,当应用程序尝试加载大图像时,它会抛出 OutOfMemory。
【问题讨论】:
标签: android memory-management out-of-memory heap-memory
getMemoryClass() 可让您估计应用程序中可用的内存量。
getLargeMemoryClass() 为您估计可以分配给应用程序的大堆大小。
因此,首先调试您的应用程序以了解它究竟在哪里抛出异常(行),然后添加日志以查看您获得了多少内存。
【讨论】:
如何防止应用程序内存不足?
分配更少的内存。例如,对于图像,使用BitmapFactory.Options 上的inSampleSize 之类的内容仅将您需要的内容加载到内存中,而不是整个图像。
此外,如果您的图像将具有相同的分辨率,请使用 inBitmap 重用已分配的 Bitmap 对象,而不是让它们被垃圾回收。
有什么方法可以在应用程序因内存不足而崩溃之前获得通知?
不,因为你不是内存不足。
我如何知道应用程序将达到堆容量?
您没有达到“堆容量”。
Dalvik 的垃圾收集器是一种非压缩(或非移动)垃圾收集器,因此随着时间的推移,您的堆会变得碎片化。 OutOfMemoryError 表示您正在尝试分配没有足够大的单个空闲块的东西。我写了a blog post that explains this a bit more 并解释了新的 ART 运行时将如何在这方面提供帮助。
【讨论】:
Bitmap 逻辑包装在 try/catch 块中并注意 OutOfMemoryError 异常。