问题标签 [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 投票
7 回答
23150 浏览

java - Java中有SoftHashMap吗?

我知道有一个WeakHashMapin java.util,但是因为它使用WeakReferences 来表示所有东西,它只被 this引用,所以被Map引用的对象将在下一个 GC 循环中丢失。因此,如果您想缓存随机数据,这几乎是没有用的,很可能会再次请求而不会在其余时间进行硬链接。最好的解决方案是使用SoftReferences 代替的地图,但我在 Java RT 包中没有找到。

0 投票
12 回答
228467 浏览

java - Java中的SoftReference和WeakReference有什么区别?

java.lang.ref.WeakReference和有什么区别java.lang.ref.SoftReference

0 投票
9 回答
5143 浏览

c# - 为什么 .NET 没有像 Java 那样的 SoftReference 和 WeakReference?

我真的很喜欢 WeakReference 的。但我希望有一种方法可以告诉 CLR 多少(例如,在 1 到 5 的范围内)您认为该引用有多弱。那将是辉煌的。

Java 有 SoftReference、WeakReference,我相信还有第三种类型,称为“幻像引用”。那是 3 个级别,GC 在决定该对象是否获得印章时具有不同的行为算法。

我正在考虑将.NET 的 WeakReference 子类化(幸运的是,它没有被密封)来制作一个基于过期计时器或其他东西的伪 SoftReference。

0 投票
10 回答
13009 浏览

java - 如何在 Java 中清除软引用?

我有一个缓存,其中包含对缓存对象的软引用。我正在尝试为使用缓存的类的行为编写功能测试,专门用于清除缓存对象时发生的情况。

问题是:我似乎无法可靠地清除软引用。简单地用完一堆内存并不能解决问题:在清除任何软引用之前,我得到了 OutOfMemory。

有没有办法让 Java 更急切地清理软引用?


在这里找到

“虽然可以保证在抛出 OutOfMemoryError 之前所有 SoftReferences 都会被清除,因此理论上它们不会导致 OOME。”

那么这是否意味着上述情况一定意味着我在某个地方有内存泄漏,某个类在我的缓存对象上持有硬引用?

0 投票
5 回答
1532 浏览

.net - 相当于.net中的SoftReference?

我熟悉WeakReference,但我正在寻找一种在内存不足时才清除的引用类型,而不仅仅是每次 gc 运行时(就像 Java 一样SoftReference)。我正在寻找一种实现内存敏感缓存的方法。

0 投票
3 回答
5732 浏览

java - Java中的软引用LinkedHashMap?

Java 中有基于软引用的 LinkedHashMap 吗?如果没有,有没有人有我可以重用的代码片段?我保证会正确引用它。

谢谢。

0 投票
3 回答
932 浏览

java - 有什么方法可以确定 Java 中的对象是否可轻松访问?

为了执行一些测试,我想检查当我存储在 SoftReference 对象缓存中的部分或全部对象被处置时我的应用程序的行为。

为了做到这一点,我想手动清除存储在缓存的 SoftReference 对象中的引用 - 模拟 VM 处理这些对象 - 但前提是当前没有其他任何东西对该对象具有强引用(如果另一个进程最近从缓存中检索了引用的对象)。

我的应用程序是单线程的,所以我不需要担心缓存对象的软可达性会随着代码的执行而改变。这也意味着我目前没有任何锁定机制 - 如果我有,我可能已经使用这些来确定一个对象是否“正在使用”并因此可以强访问,但可惜我不需要这种锁定。

我尝试过的一种方法是为存储在缓存中的每个对象创建一个额外的 SoftReference,该缓存已注册到 ReferenceQueue。我希望这样做时,缓存中的所有软可访问对象都会将它们的附加 SoftReference 添加到队列中,所以我所要做的就是遍历队列,并从缓存中删除这些对象。但是,似乎 GC 在闲暇时会将可轻松访问的对象排入其各自的队列,因此一旦我完成对缓存中的对象的迭代,就不能保证任何东西都会添加到队列中。

我还看过的一件事是 -XX:SoftRefLRUPolicyMSPerMB JVM 选项,它的值非常小。通过明智的内存分配,这很可能会在软可访问的那一刻为我从缓存中清除软可访问的对象,但我真的希望应用程序正常运行,直到我收到从缓存中清除软可访问对象的请求. 作为 JVM 选项,我不相信我可以在我的应用程序运行时更改此值。

那么,是否有人对我如何确定一个对象是否只能轻触(因此可以清除)有任何想法?

编辑:可能还不清楚的一些额外点:

  • 当我想清除这些软引用对象时,该应用程序可能会做有用​​的工作。所以我宁愿不要尝试让 GC 为我清除对象。
  • 如果我可以选择清除哪些可轻松到达的对象,那将是更可取的。
  • 我想让应用程序正常运行,即使用生产内存设置。更改代码中的设置,然后可以将其重置回其生产值,这很好。
0 投票
4 回答
2751 浏览

java - 优雅地完成 SoftReference 引用

我正在使用一个搜索库,它建议保持搜索句柄对象打开,这样可以使查询缓存受益。随着时间的推移,我观察到缓存趋于膨胀(几百兆并不断增长)并且 OOM 开始出现。没有办法强制这个缓存的限制,也没有计划它可以使用多少内存。所以我增加了Xmx限制,但这只是临时解决问题的方法。

最终我想使这个对象成为. java.lang.ref.SoftReference因此,如果系统的可用内存不足,它会释放对象并按需创建一个新对象。这会在重新开始后降低一些速度,但这是一个比 OOM 更好的选择。

我看到的关于 SoftReferences 的唯一问题是没有明确的方法可以最终确定它们的所指对象。就我而言,在销毁搜索句柄之前,我需要关闭它,否则系统可能会用完文件描述符。显然,我可以将此句柄包装到另一个对象中,在其上编写终结器(或挂钩到 ReferenceQueue/PhantomReference)然后放手。但是,嘿,这个星球上的每一篇文章都建议不要使用终结器,尤其是 - 反对使用终结器来释放文件句柄(例如Effective Java ed. II,第 27 页。)。

所以我有些不解。我是否应该小心忽略所有这些建议并继续前进。否则,还有其他可行的替代方案吗?提前致谢。

编辑#1:按照 Tom Hawtin 的建议测试了一些代码后添加了以下文本。对我来说,似乎任何一个建议都不起作用,或者我错过了一些东西。这是代码:

如果我使用-Xmx10m和 SoftReferences 运行上面的代码片段(如上面的代码),我会得到大量的is null :(打印。但是,如果我用MyReference(用 MyReference 取消注释两行并用 SoftReference 注释掉两行)替换代码,我总是会得到 OOM。

正如我从建议中了解到的那样,内部有硬引用MyReference不应该阻止物体撞击ReferenceQueue,对吧?

0 投票
12 回答
10815 浏览

java - 如何使用可用 RAM 在 Java 中有效地缓存对象?

我需要使用可用 RAM 的一部分在 Java 中缓存对象。我知道其他人已经问过这个问题,但没有一个回答符合我的要求。

我的要求是:

  • 简单轻便
  • 并不比普通的 HashMap 慢很多
  • 使用 LRU,或一些近似于 LRU 的删除策略

我尝试了 LinkedHashMap,但是它要求您指定最大元素数,而且我不知道填充可用 RAM 需要多少元素(它们的大小会相差很大)。

我目前的方法是使用 Google Collection 的 MapMaker,如下所示:

这看起来很有吸引力,因为它应该在需要更多 RAM 时自动删除元素,但是有一个严重的问题:它的行为是填满所有可用的 RAM,此时 GC 开始颠簸,整个应用程序的性能急剧下降。

我听说过 EHCache 之类的东西,但对于我需要的东西来说它似乎很重,而且我不确定它对于我的应用程序是否足够快(记住该解决方案不能比 HashMap 慢得多) .

0 投票
4 回答
2122 浏览

java - Java中软引用的用例是什么?

Java中软引用的用例是什么?当 JVM 内存不足时,垃圾收集非关键项目是否有用,以便在关闭 JVM 之前释放足够的资源来转储关键信息?

它们是否被称为软引用,因为它们是软的并且在“承受压力”时会中断,即:JVM 内存不足。我了解弱引用和幻像引用,但在需要这些时并不真正了解。