【发布时间】:2014-04-24 16:21:19
【问题描述】:
我正在开发一个需要在内存中存储许多位图图像的应用程序。毫不奇怪,当位图集合变得太大时,OutOfMemoryError 经常在某些设备上被捕获。我需要以某种方式避免这种情况。
简单地说,我需要一种集合,它会表现出一种“逐个添加项目,直到添加下一个项目会导致OutOfMemoryError”,但我没有足够的经验找到一个适当的方法。我相信,应该实现某种弱引用集合。
我喜欢WeakHashMap,但它有一个关键问题——我无法控制如何丢弃物品。在我的应用程序中,位图是按优先级顺序添加的:最重要的位图,应该尽可能长时间地存储,首先放置。据我了解,WeakHashMap 没有提供这样的优先级。
有什么可行的方法或想法吗?
P. S. 这个问题不是关于位图优化的。想象一下,有一些无法压缩或优化的大对象而不是位图。问题是关于将项目存储在内存中直接控制它们的优先级,以便可以快速 GC 或根本不添加低优先级的对象。
P。 P.S. 到目前为止,我发现了两种可能的解决方案:
1) 将集合分为两部分,第一,优先级更高,将包含项目本身(即强引用),第二部分将包含软引用。可以使用Runtime.getRuntime.maxMemory() 和.totalMemory() 处理添加控制--当堆占用的totalMemory 超过maxMemory 的某个百分比时,应禁止将新项添加到集合中;
2) 使用软引用的集合并跟踪项目的finalize()--当它被调用时(即相应的对象将被 GC 拾取),将此项目作为软引用返回到集合并替换另一个项目 - 具有最低优先级 - 通过幻像引用。从理论上讲,这会提供更严格的优先级控制,但我不确定它在实践中会如何表现。
【问题讨论】:
-
@nKn 你读过这个问题吗?
-
是的。 你读过那个链接了吗?
-
@nKn 我当然做到了。我的问题不是关于位图优化...想象一下没有位图,而是一些抽象对象,它们应该按优先级顺序存储,允许优先级较低的对象快速被 GC。
标签: java android memory-management weak-references