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

java - 软引用在java中GC的作用

最近我遇到了这篇文章,它对 Jenkins 进行了 GC 调整,其中谈到了这个参数:-XX:SoftRefLRUPolicyMSPerMB

https://jenkins.io/blog/2016/11/21/gc-tuning/

我知道它可以防止 OOM 错误,因为它会在达到阈值时清除软引用对象。

1) 这个阈值是什么意思(默认 = 1000ms in -XX:SoftRefLRUPolicyMSPerMB)是什么意思?这个值代表什么?

2)我的詹金斯似乎有 80% 的软参考(使用 HProf 观察)

3) 如上述文章中所建议的,如果我将这个 -XX:SoftRefLRUPolicyMSPerMB 标志减少到 10ms 会有什么后果?

注意:我们使用 G1GC

谢谢,
哈利

0 投票
0 回答
55 浏览

android - GC'd 后如何处理 SoftReference 侦听器?

所以我一直在玩这个新库,我注意到我必须提供上下文的其中一个侦听器是通过SoftReference.

我的活动即使在后台运行时也会做很多繁重的工作,这可能会导致它SoftReference被 GC'd ......这不好,因为我正在监听一些可能随时发生的事件。

如果此侦听器被 GC 处理,那么处理此问题的正确方法是什么?

0 投票
1 回答
141 浏览

java - java中的所有软引用会一次性清除吗?

我读了这篇文章,现在我清楚了弱引用和软引用之间的基本区别是什么。我也明白,与弱引用不同(如果没有对该对象的强引用,这将导致在下一个 GC 周期中收集该对象),软引用保留在内存中,直到 JVM 内存不足。

但我的问题是,如果 JVM 内存不足并且垃圾收集器也开始收集软引用,它应该在逻辑上收集所有带有软引用的现有对象(我的猜测)。我是对的吗?

我想到的另一件事是软引用有一个非常好的用例,即内存缓存。但如果我拥有的所有软引用都将被 GC 一次性清除,那么这可能不是我们一直想要的预期结果。

有没有办法控制将被清除的软引用的百分比?或者我们可以告诉 GC 在恢复了特定数量的内存后停止清除软引用吗?

我问这个是为了更好地掌握如何有效地使用软引用,显然没有人会希望他们的缓存完全从内存中清除,即使您需要非常少量的内存。

0 投票
2 回答
585 浏览

java - 什么是柔软可触及的物体?

我正在尝试通过这篇“Java 中的软引用”文章来研究软引用的含义:

https://www.baeldung.com/java-soft-references

我理解这篇文章的问题是它通过术语“软可达对象”来定义术语“软引用”,但我不知道“软可达对象”是什么意思。

也就是说,堆中的一个对象要么有它的引用,要么没有,对吧?

引用要么指向有效对象,要么为空,对吗?

一个对象什么时候变得“轻而易举”?

还是我弄错了?

0 投票
1 回答
99 浏览

java - 有什么方法可以判断方法是否结束或方法中的本地不再使用?

在这种情况下,我需要一些解决方案来帮助我了解一些方法:

如果此方法已结束或 obj 是否无法访问(这将表明该方法已结束)。

我正在编写一个小型 Java 代理,我希望有一些技术可以让我确定此方法已结束或 obj 无法访问……在我的情况下,“do stuff”部分根本不使用 obj . 它不会将此变量传递到其他地方或将其添加到某个集合中。

我知道通过 Weak/Soft/Phantom-References 我可以部分实现这一点。如果调用 GC,则通过:

我总是可以在不同的地方验证:

然而,这只有在 GC 发生时才可能成立。

有没有其他方法可以实现这一目标?例如,一些标记 JVM 可能会放在这个变量上,因为很明显这是一个绝对可以垃圾回收的本地变量......

我不想依赖 ASM - 并为所有这些方法添加一个 try-finally 包装器。希望有一个更微妙的、基于参考的解决方案。

0 投票
0 回答
45 浏览

java - CMS 如何决定何时收集 SoftReference?

我使用软引用编写了一个内存敏感缓存。

一开始还不错,但几天后,内存压力变大了,然后突然下降。

好吧,这是意料之中的,我希望缓存尽可能长时间地保存数据,但不要太长而导致内存不足。一种优雅的退化。

但从那时起,它就没有那么好了。我发现不知何故它已经变得更加积极地丢弃数据。

问题是,JVM 是否以某种方式自适应地调整自己并决定更积极地放弃 SoftReference?

0 投票
3 回答
276 浏览

java - Java SoftReference 奇怪的行为

我已经 map 声明了一个类似于上面的地图,我将其用作缓存。

问题是我要在将项目添加到缓存后立即在缓存上执行所有操作,而不是稍后。

例如:

if(cache.contains("Username"))返回 true 但

String userName = (String)cache.get("Username")返回空值。

这只有在很长一段时间后才会发生。

如果我在将它添加到缓存几个小时后得到了这个值,我就得到了正确的值。如果我在很长一段时间后得到这个值,比如超过 15-20 小时,我会得到空值。

GC清除SoftReference对象时,key会留在HashMap中吗?这是这种行为的原因吗?

0 投票
3 回答
538 浏览

java - 如何强制释放软引用

我知道软引用只会在 JVM 内存不足时释放。我该如何手动完成?

我的代码:

最新的java版本(8-11)有解决方案吗?

0 投票
1 回答
125 浏览

java - Java GC 未清除 SoftReference

我试图理解Java 中的SoftReferences,它基本上确保在抛出StackOverflowError之前清除 SoftReferenced 对象的内存。

然而上面的结果是

有人能解释一下为什么对象没有被 GC 清除吗?我怎样才能让它工作?

0 投票
1 回答
230 浏览

java - 具有软引用值的 HashMap 实现

我想要一个映射到相当大对象的键映射。由于地图将用作缓存,因此我希望通过软链接 ( java.lang.ref.SoftReference) 引用值/条目以在纯内存上清除它。但在这种情况下,我需要有自己的computeIfAbsent()方法实现。

我可以通过以下方式实现它:

只是想知道,这样的地图是否有开箱即用的解决方案,比如java.util.WeakHashMap

谢谢!