java - SoftReference 过早地收集垃圾

标签 java android garbage-collection soft-references

我正在为我的 Android 应用程序实现缓存机制。

我使用 SoftReference,就像我发现的许多示例一样。问题是,当我在 ListView 中向上或向下滚动时,大部分 图像已经被清除。我可以在 LogCat 中看到,每次应用程序加载新图像时,我的应用程序都会被垃圾收集。这意味着 ListView 中的大部分 不可见图像都消失了。

因此,每次我回滚到较早的位置(我之前真正下载过图像的位置)我都必须再次下载图像 - 它们不是 缓存

我也研究过这个话题。 According to Mark Murphy in this article ,似乎存在(或曾经存在?)SoftReference 的错误。其他一些结果表示相同的事情(或相同的结果); SoftReference 清除得太早了。

有什么可行的解决方案吗?

最佳答案

SoftReference 是可怜的缓存。 JVM 可以让这些引用存活更长时间,但不是必须的。一旦不再有硬引用,JVM 就可以对软引用的对象进行垃圾回收。您遇到的 JVM 的行为是正确的,因为 JVM 不必长时间保留此类对象。当然,大多数 JVM 都试图在某种程度上让软引用对象保持 Activity 状态。

因此 SoftReferences 是一种危险的缓存。如果你真的想确保缓存行为,你需要一个真正的缓存。喜欢 LRU-cache .尤其是当缓存对性能至关重要时,您应该使用适当的缓存。

关于java - SoftReference 过早地收集垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5757969/

相关文章:

android - 如何为 subview 设置动画并让父 View 自动调整大小?

android - 用于混合 2 个 mp3 文件的 API

android - 我得到的时间比时间选择器的当前时间早 12 小时

PHP pThreads - 如何执行垃圾收集?

java - 如何使用Java从笔记本触摸板输入信息

java - 在spring MVC中重定向期间传递模型属性并避免在URL中相同

Java 和泛型类

java - 在 Maven 中检查生命周期/阶段和文件是否存在并报告错误

java - java 垃圾收集日志条目 "Full GC (System)"是否意味着某个名为 System.gc() 的类?

java - 为什么 SetByteArrayRegion 不会损坏内存?