问题标签 [soft-references]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4435 浏览

android - Android:位图、软引用和 OOM?

我在垂直线性布局中有一系列视图。每个视图在滚动到时都会生成并绘制一个位图。出于性能原因,我宁愿在每次调用 onDraw() 时都不生成位图,但出于内存原因,我不能保留对位图的硬引用。我可以就我应该采取的策略提出建议。

我已经尝试了明显的路线:生成位图,然后用 SoftReference 包装它。这失败了有两个原因。1. 参考文献的收集比我预期的要热切得多。2. 我仍然得到 OOM!这令人震惊,因为没有 Bitmap 是特别大的,所以单个视图不应该导致 OOM,让我假设 OOM 的发生是因为有问题的 SoftReference(s) 没有被释放的机会。此外,当我的应用程序分配的堆大小为 6mb(根据 DDMS 视图)时,会发生 OOM,我希望它在抛出 OOM 之前增长到 16mb。

有什么建议吗?

0 投票
1 回答
1460 浏览

java - Java中不同引用类型的使用

我最近一直在玩 Java 中的软、弱和幻像引用类型,并且一直想知道它们是否有任何我没有遇到过的用途。我过去曾将它们用于各种事情,它们总是属于以下类别:

  • 使用幻像引用代替终结器 - 我更喜欢这个,因为死对象复活的可能性为 0
  • 在 hashmap 中使用弱引用来保存 object=>value 映射,其中仅当对象存在于其他地方时映射才应存在(当需要向库中的对象添加额外信息时很有用,例如其源不能是修改的)
  • 使用软引用进行缓存(比弱引用效果更好,因为 JVM 将它们保留更长时间,并且只有在需要时才放手。)

但是,那里只有 3 种用途,我敢说还有很多我从未遇到过的可能有用的东西。欢迎所有建议!

0 投票
1 回答
2865 浏览

android - Android:BitmapFactory.decodeStream OutOfMemoryException - SoftReference 是解决方案吗?

我收到 OutOfMemoryException:

在以下函数中:

FlushedInputStream (虽然我在添加此代码之前得到了错误):

基本上,我有一个下载图像的活动,将它们放在框架布局中并淡入淡出帧以提供幻灯片。框架布局有两个 imageview 孩子。

我见过人们谈到使用 SoftReference 来防止 OOMExceptions,但我不明白这将如何应用于我的代码以(希望)防止此错误。

谁能解释如何实现这一目标?

0 投票
4 回答
976 浏览

scala - Scala 中有 SoftHashMap 吗?

我知道java 的这个问题,但这些实现似乎都不能很好地与scala.collection.JavaConversions.

我正在寻找一些简单的东西(例如单个文件,而不是整个库),SoftHashMap以使其与 Scala 配合良好Map(即支持getOrElseUpdate,unzip和其余的 ScalaMap方法)。

0 投票
1 回答
261 浏览

caching - collection.immutable.Map[ K, SoftReference[ V ]] 在谷歌的 MapMaker 上?

假设一个潜在的多线程环境。我想将地图与(值)缓存一起使用。为什么我更喜欢其中之一

超过另一个?该地图将存储在 STM 参考中,因此不可变将是直截了当的。此外,K很可能会是Long,所以我可以使用collection.immutable.LongMap.

在这里使用谷歌收藏有什么好处?性能和空间明智?

0 投票
5 回答
3927 浏览

java - SoftReference 过早地收集垃圾

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

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

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

我也研究过这个话题。根据本文中的 Mark Murphy 的说法,似乎存在(或曾经是?)SoftReference. 其他一些结果表明相同的事情(或相同的结果);SoftReferences 清理得太早了。

有没有可行的解决方案?

0 投票
2 回答
1539 浏览

android - Android OutOfMemoryException on createScaledBitmap 和 SoftReferences 的作用?

我得到了一个OOM。我知道以前的问题已经涵盖了很多,但我的问题通常与 Android 和 Java 的内部有关。

当我在随机点加载图像时,我得到了这个可怕的 OOM 异常。

我确实在 HashMap> 中有我的图像。从 SoftReferences 定义中,如果内存不足,我希望 Drawables 被 GC 处理。

相比之下,从我之前的研究中,我发现可绘制对象中的位图分配在与我的应用程序堆不同的堆(本机堆)中。这就解释了为什么在 DDMS 上,尽管我看到我正在使用 6MB 的内存,但我的应用程序仍然崩溃。

似乎 SoftReferences 对于缓存来说是“完美的”,并且被 Android 工程师推荐使用。

我的问题是,由于我的应用程序堆从未达到 MAX 点,这应该意味着我的 SoftReferences 永远不会被 GC 处理。

我该如何解决这个问题?那么使用 SoftReferences 真的有什么好处吗?我没有正确理解某些东西吗?

谢谢!

0 投票
2 回答
337 浏览

java - 在一个集合中混合不同的引用类型

SoftReference, WeakReference,PhantomReference可用于自定义垃圾回收的过程。所有这些都扩展Reference<T>,因此可以将它们混合在单个集合中。硬引用(最常见的)没有扩展Reference<T>,因此不可能在一个集合中混合硬引用和其他类型的引用。我是对的,我们应该把CustomReference<T> extends Reference<T>所有类型的对象链接混合在单个集合中,我们应该把它放入集合中Collection<Reference<T>>吗?

更新:因此,在编写SSCCE时,我发现无法以Reference<T>通常的方式进行扩展(构造函数是包本地的)。

所以问题现在更新到以下内容:我可以使用单个集合类创建缓存,它总是保存一些对象(比如 10 个),而其他对象在内存不允许时由 GC 回收?除了为硬引用和软引用提供自定义包装器并将它们存储在集合中之外,还有其他方法可以做到这一点吗?

0 投票
3 回答
7918 浏览

android - android : SoftReference / WeakReference 示例

我正在OutOfMemoryError申请我的申请。当我浏览了一些教程时,我才知道,我可以通过使用Softreference/Weakreference. 但我不知道如何使用Softreference/Weakreference.

请向我推荐一些提供软引用或弱引用示例的教程。

谢谢...

0 投票
2 回答
903 浏览

java - 使用软引用的“实际后果”是什么?

根据 Guava 的文档MapMaker.softValues()

警告:在大多数情况下,最好设置每个缓存的最大大小,而不是使用软引用。仅当您非常熟悉软引用的实际后果时,才应使用此方法。

我对软引用有一个中等的了解——它们的行为、用途以及它们与垃圾收集的约定。但是我想知道文档所暗示的这些实际后果是什么。为什么使用最大尺寸而不是软引用更好?在实现缓存方面,软引用的算法和行为是否比硬编码天花板更有效?