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

java - Java:在 HttpSession 中保持对 ArrayList 的 SoftReference 的任何问题/负面影响?

我的代码正在执行以下操作(仅作为示例,我指定 java.lang.ref.SoftReference 的包路径的原因是要注意它不是我自己的实现:-):

然后:

有什么缺点吗?哪个我没看到?谢谢!

0 投票
2 回答
741 浏览

java - 测试使用 SoftReference 的代码

要使任何代码SoftReference<T>都经过全面测试,必须想出某种方法来测试“是的,它已被取消”的情况。人们可能或多或少地通过使用“测试”代码路径来强制引用为空来模拟这一点,但这不会像 GC 那样管理队列。我想知道是否有人可以分享建立一个可重复的、受控的环境的经验,实际上,在这个环境中,GC 被激发为收集和归零?

0 投票
5 回答
2112 浏览

c++ - C ++中的软(不是:弱)引用-可能吗?有实现吗?

在 C++ 中,我使用boost::shared_ptrandboost::weak_ptr来自动删除不再需要的对象。我知道这些与引用计数有关。

在 Java 中,内存由垃圾收集器管理,它认为内置的对象引用是强介于两者之间的(可能被 GC 收集,但也可能在 GC 中幸存下来),这真的很方便用于缓存对象一段时间,但在可用内存变低时将其丢弃。WeakReferenceSoftReference

所以现在我回到了 C++,我想念软引用带来的舒适感。我想知道软引用是否完全适用于引用计数。当对一个对象的最后一个引用被清除,并且还有一个引用时,它到底什么时候会被删除呢?我可以想出一些方案,但在我看来它们都不聪明。

以防万一软引用和引用计数有适当的语义,我想知道这是否已经实现,也许以一种甚至兼容的方式boost::shared_ptr(或与此相关的 C++ TR1 等效项std::shared_ptr)。

如果这两个问题的答案都是否定的,那么在对象缓存场景中还有哪些替代方案?

编辑: 当然,我说的是缓存实际上很有用的情况,因为对象的构建成本很高(考虑对数据库的多次访问和网络查询),但有太多无法永久保存它们。

0 投票
4 回答
21716 浏览

java - 了解 Java 的引用类:SoftReference、WeakReference 和 PhantomReference

有人可以解释三个参考类之间的区别(或发布一个很好的解释的链接)吗?SoftReference> WeakReference> PhantomReference,但我什么时候会使用每一个?为什么有一个WeakHashMap但没有SoftHashMapPhantomHashMap

如果我使用以下代码...

...怎么了?我是否必须ref在每条语句之前检查是否为空(这是错误的,但我该怎么)?很抱歉这些快速的问题,但我无法理解这些Reference课程......谢谢!

0 投票
5 回答
6058 浏览

java - 如何让java系统发布Soft References?

我将使用基于 SoftReference 的缓存(这本身就是一件非常简单的事情)。但是,我在为它编写测试时遇到了一个问题。

测试的目的是检查缓存是否在内存清理发生后再次向服务器请求先前缓存的对象。

在这里,我发现了如何使系统释放软引用对象的问题。调用System.gc()是不够的,因为在内存不足之前不会释放软引用。我正在 PC 上运行此单元测试,因此 VM 的内存预算可能非常大。

==================稍后添加==============================

谢谢所有认真回答的人!

在考虑了所有专业人士和反对人士之后,我决定按照nandajarnbjo的建议采用蛮力方式。然而,JVM 似乎并没有那么愚蠢——如果你请求一个单独大于 VM 内存预算的块,它甚至不会尝试垃圾收集。所以我修改了这样的代码:

0 投票
1 回答
220 浏览

.net - .NET 有软引用吗?

可能重复:
为什么 .NET 没有像 Java 那样的 SoftReference 和 WeakReference?

Java 有几种类型的引用,其中两种是WeakSoft。我知道 .NET 有引用,但它也有软引用吗?

(软引用比弱引用更强,因为即使不存在强引用,它们也会尝试保持对象处于活动状态。但是当内存紧张时它们会释放。)

0 投票
3 回答
412 浏览

java - GC 会收集 SoftReference 和 WeakReference 引用的对象吗?

我有一个从 Map 到 SoftReferences 的缓存。当它们被添加时,它们会被放入另一个队列中,以便通过 gzip 或类似的方式延迟压缩。我的想法是:我希望对压缩队列中的对象进行弱引用,这样当压缩任务到达对象时,如果它已经消失,我们就不必费心压缩它——而且压缩队列也没有t 保持对象处于活动状态,否则会被 GC 处理。

那么如果恰好有一个 SoftReference 和一个 WeakReference,那么 SoftReference 的语义是否仍然适用?

0 投票
3 回答
1934 浏览

android - Android:GC 不尊重 SoftReferences?

它表明 Dalvik 的垃圾收集器不尊重 SoftReferences 并尽快删除它们,就像 WeakReferences 一样。我还不是 100% 确定,但尽管仍有大约 3MB 的可用内存,但在我在 LogCat 中看到“GC 释放 bla-bla-bla 字节”后,我的 SoftReferences 被清除了。

另外,我在这里看到了 Mark Murphy 的评论:

除了它不能在 Android 上运行,至少在 1.5 时间范围内。我不知道 GC SoftReference 错误是否已修复。SoftReferences 很快就会因为这个错误而被 GC。

这是真的吗?是否不尊重软引用?

如何解决这个问题?

0 投票
1 回答
1237 浏览

java - Implementing a Write-Back Cache in Java

I trying to implement a write-back cache. I'm trying to use soft referenes, but I'm having troubles performing the post-mortum write-back because the reference is cleared before it's added to the gcQueue and thus I don't have access to the referent object.

Solutions?

0 投票
2 回答
918 浏览

java - 这是使用软引用的正确方法吗

前段时间我使用软引用创建了一个缓存,但在尝试解决一个错误时,我开始担心实际上我做错了,它在不应该删除对象时删除了对象。这就是我的做法:

所以这个想法是一个调用进程可以添加新的缓冲对象,这些对象可以通过键和来识别/查找,然后只要这个缓冲对象被至少一个对象使用,它就不会从地图中删除,但是如果它不再被任何对象使用,那么如果内存变得紧张,它可能是垃圾收集。

但是现在看我的代码很重要,关键字段总和总是在其他地方被引用(不一定是这种情况)

编辑:所以我尝试了 Colin 的解决方案,但我有点难过,因为 putIfAbsent() 似乎没有返回附加值。我修改了我的 addImage 方法以进行一些调试

返回

所以它清楚地表明 Buffered 实例不是从那里开始的,并且已成功构建和添加,但肯定应该由 putIfAbsent 返回?