问题标签 [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.
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
谢谢,
哈利
android - GC'd 后如何处理 SoftReference 侦听器?
所以我一直在玩这个新库,我注意到我必须提供上下文的其中一个侦听器是通过SoftReference
.
我的活动即使在后台运行时也会做很多繁重的工作,这可能会导致它SoftReference
被 GC'd ......这不好,因为我正在监听一些可能随时发生的事件。
如果此侦听器被 GC 处理,那么处理此问题的正确方法是什么?
java - java中的所有软引用会一次性清除吗?
我读了这篇文章,现在我清楚了弱引用和软引用之间的基本区别是什么。我也明白,与弱引用不同(如果没有对该对象的强引用,这将导致在下一个 GC 周期中收集该对象),软引用保留在内存中,直到 JVM 内存不足。
但我的问题是,如果 JVM 内存不足并且垃圾收集器也开始收集软引用,它应该在逻辑上收集所有带有软引用的现有对象(我的猜测)。我是对的吗?
我想到的另一件事是软引用有一个非常好的用例,即内存缓存。但如果我拥有的所有软引用都将被 GC 一次性清除,那么这可能不是我们一直想要的预期结果。
有没有办法控制将被清除的软引用的百分比?或者我们可以告诉 GC 在恢复了特定数量的内存后停止清除软引用吗?
我问这个是为了更好地掌握如何有效地使用软引用,显然没有人会希望他们的缓存完全从内存中清除,即使您需要非常少量的内存。
java - 什么是柔软可触及的物体?
我正在尝试通过这篇“Java 中的软引用”文章来研究软引用的含义:
https://www.baeldung.com/java-soft-references
我理解这篇文章的问题是它通过术语“软可达对象”来定义术语“软引用”,但我不知道“软可达对象”是什么意思。
也就是说,堆中的一个对象要么有它的引用,要么没有,对吧?
引用要么指向有效对象,要么为空,对吗?
一个对象什么时候变得“轻而易举”?
还是我弄错了?
java - 有什么方法可以判断方法是否结束或方法中的本地不再使用?
在这种情况下,我需要一些解决方案来帮助我了解一些方法:
如果此方法已结束或 obj 是否无法访问(这将表明该方法已结束)。
我正在编写一个小型 Java 代理,我希望有一些技术可以让我确定此方法已结束或 obj 无法访问……在我的情况下,“do stuff”部分根本不使用 obj . 它不会将此变量传递到其他地方或将其添加到某个集合中。
我知道通过 Weak/Soft/Phantom-References 我可以部分实现这一点。如果调用 GC,则通过:
我总是可以在不同的地方验证:
然而,这只有在 GC 发生时才可能成立。
有没有其他方法可以实现这一目标?例如,一些标记 JVM 可能会放在这个变量上,因为很明显这是一个绝对可以垃圾回收的本地变量......
我不想依赖 ASM - 并为所有这些方法添加一个 try-finally 包装器。希望有一个更微妙的、基于参考的解决方案。
java - CMS 如何决定何时收集 SoftReference?
我使用软引用编写了一个内存敏感缓存。
一开始还不错,但几天后,内存压力变大了,然后突然下降。
好吧,这是意料之中的,我希望缓存尽可能长时间地保存数据,但不要太长而导致内存不足。一种优雅的退化。
但从那时起,它就没有那么好了。我发现不知何故它已经变得更加积极地丢弃数据。
问题是,JVM 是否以某种方式自适应地调整自己并决定更积极地放弃 SoftReference?
java - Java SoftReference 奇怪的行为
我已经 map 声明了一个类似于上面的地图,我将其用作缓存。
问题是我要在将项目添加到缓存后立即在缓存上执行所有操作,而不是稍后。
例如:
if(cache.contains("Username"))
返回 true 但
String userName = (String)cache.get("Username")
返回空值。
这只有在很长一段时间后才会发生。
如果我在将它添加到缓存几个小时后得到了这个值,我就得到了正确的值。如果我在很长一段时间后得到这个值,比如超过 15-20 小时,我会得到空值。
GC清除SoftReference对象时,key会留在HashMap中吗?这是这种行为的原因吗?
java - 如何强制释放软引用
我知道软引用只会在 JVM 内存不足时释放。我该如何手动完成?
我的代码:
最新的java版本(8-11)有解决方案吗?
java - Java GC 未清除 SoftReference
我试图理解Java 中的SoftReferences,它基本上确保在抛出StackOverflowError之前清除 SoftReferenced 对象的内存。
然而上面的结果是
有人能解释一下为什么对象没有被 GC 清除吗?我怎样才能让它工作?
java - 具有软引用值的 HashMap 实现
我想要一个映射到相当大对象的键映射。由于地图将用作缓存,因此我希望通过软链接 ( java.lang.ref.SoftReference
) 引用值/条目以在纯内存上清除它。但在这种情况下,我需要有自己的computeIfAbsent()
方法实现。
我可以通过以下方式实现它:
只是想知道,这样的地图是否有开箱即用的解决方案,比如java.util.WeakHashMap
?
谢谢!