如何在Android中避免OutOfMemoryError

时间:2014-04-24 16:21:20

标签: java android memory-management weak-references

我正在处理一个需要在内存中存储许多位图图像的应用。毫不奇怪,当位图集合变得太大时,OutOfMemoryError经常会被某些设备捕获。我需要以某种方式避免这种情况。

简单地说,我需要一种表现为"逐个添加项目的集合,直到添加下一项会导致OutOfMemoryError" ,但我&#39 ;我没有经验足以找到合适的方法。我相信,应该实施某种弱参考集合。

我喜欢WeakHashMap,但它有一个至关重要的问题 - 我无法控制如何丢弃项目。在我的应用程序中,位图按优先级顺序添加:最重要的位图,应尽可能长时间存储,先行。据我所知,WeakHashMap并未提供此类优先排序。

任何工作方法或想法?

P上。 S.这个问题与位图优化无关。想象一下,有一些大的对象而不是位图,无法压缩或优化。问题是关于将项目存储在内存中直接控制其优先级,以便优先级较低的对象可以快速GC或根本不添加


P上。 P. S.到目前为止,我发现了两种可能的解决方案:

1)将一个集合分成两部分,这样第一个,更优先的,将包含项本身(即强引用),第二个将包含软引用。可以使用Runtime.getRuntime.maxMemory().totalMemory()处理添加控制 - 当堆占用的totalMemory超过maxMemory的某个百分比时,应禁止向集合中添加新项;

2)使用一组软参考和跟踪项目' finalize() - 当它被调用时(即相应的对象将被GC选中),将此项作为软引用返回到集合,并通过幻像引用替换另一项 - 具有最小优先级。从理论上讲,这会给予更严格的优先级控制,但我不确定它在实践中的表现如何。

1 个答案:

答案 0 :(得分:2)

LruCache 类似乎是一个很好的候选者。

http://developer.android.com/reference/android/util/LruCache.html

包含对有限数量值的强引用的缓存。每次访问一个值时,它都会移动到队列的头部。将值添加到完整缓存时,该队列末尾的值将被逐出,并且可能有资格进行垃圾回收。

这似乎可以提供您想要的终生控制。此外,缓存大小在您的控制之下,因此您可以动态创建使用可用内存百分比的缓存,即自动调整为可用内存量。

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html上的相关文章给出了其使用示例,包括未存储在RAM中的对象的后备磁盘缓存。