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

java - Java,将对象转换为软引用

我需要将一个数据对象放入包含软引用的弱​​哈希图中。如何将我的“可绘制”对象转换为软引用?

tempPulled 应该是 "sPulled" ,即软引用

0 投票
4 回答
1778 浏览

java - 一旦 GC 决定它无法访问,有没有办法回收一个复杂的 java 对象

在 C++ 中,我使用引用计数对象来实现一个“自动”回收对象池

-- 现在我在 C++ 对象上有一个“onFinalRelease()”方法,当 refcount 达到 0 时会调用该方法。我可以覆盖它(默认为 delete(this))以自动回收对象而不是销毁它们。

问题是我是否可以使用 java 引用类型和引用池的某种组合来实现这种模式。当然,这是针对一种在有意义的情况下创建对象成本高昂的大型复合体。那就是我想做的:

这将是真正的好:)

0 投票
7 回答
94268 浏览

java - Java:强/软/弱/幻引用之间的区别

我已经阅读了这篇关于 Java 中不同类型的引用(强、软、弱、幻)的文章,但我并不真正理解它。

这些引用类型之间有什么区别,每种类型何时使用?

0 投票
5 回答
4180 浏览

java - JVM 在实践中是如何收集 SoftReference 的?

我在 JVM 中运行了两个独立的缓存(一个由第三方库控制),每个缓存都使用软引用。我希望 JVM 在库控制的缓存之前清除我的受控缓存。SoftReference javadoc 指出:

在虚拟机抛出 OutOfMemoryError 之前,保证已清除对软可访问对象的所有软引用。否则,对清除软引用的时间或清除对不同对象的一组此类引用的顺序没有任何限制。但是,鼓励虚拟机实现偏向于清除最近创建或最近使用的软引用。

此类的直接实例可用于实现简单的缓存;此类或派生的子类也可用于更大的数据结构以实现更复杂的缓存。只要软引用的所指对象是强可达的,即实际在使用中,软引用就不会被清除。因此,例如,复杂的高速缓存可以通过保持对这些条目的强引用来防止其最近使用的条目被丢弃,而剩余的条目则由垃圾收集器自行决定丢弃。

常见的 JVM 实现,尤其是 HotSpot,在实践中是如何处理 SoftReference 的?他们是否像规范所鼓励的那样“倾向于清除最近创建或最近使用的软引用”?

0 投票
2 回答
787 浏览

android - 在 Android 中使用自定义适配器和 SoftReference 时的性能建议

我实现了一个自定义适配器来创建一个显示与位置相关的信息的对话框(对话框的每个条目由一个图像、一个显示地址的文本字段和一个显示城市和国家的文本字段组成。)在 getView ( ...) 适配器的方法除了使用 ViewHolder 模式之外,我使用 SoftReference 类来保存对创建的视图的引用,以便在 OutOfMemoryError 发生之前消除 GC 中的任何一个。我的目标是构建一个更快、更高效的缓存。在我的自定义适配器的代码下方:

我对使事情尽可能高效非常感兴趣。虽然代码可以满足我的需求,但我不确定我是否能很好地使用 SoftReference 类。例如句子(LocationItemHolder) ((SoftReference ) row.getTag ()).get()我认为它使缓存无效,因为每次调用方法 getView 时要调用的方法数来检索所需对象,还需要多次铸件。那句话可以使缓存效率低下吗?是否建议在 Android 的适配器上下文中使用 SoftReference?

提前感谢您的回答:D

0 投票
3 回答
168 浏览

java - 如果存在两级软引用对象,GC 会做什么

我知道在 Java 中我们有软引用的概念。如果:

1)有一个软引用“sf”指的是一个对象A

2)在对象A中,有强引用指向对象B

3) 对象 A 和 B 未在其他任何地方引用。

根据定义,对象 A 和对象 B 都是“可轻松访问的”,对吗?

然后说我们现在内存快用完了,GC就开始了。GC是否有可能回收对象B而不回收对象A?

如果是这样的话,以后如果我们想通过“sf”访问对象B,它将为null。java如何避免这种情况发生?

我在 java doc 中没有看到任何解释。

0 投票
1 回答
368 浏览

android - 适用于 Android 2.3+ 的软参考

我有一个应用程序可以加载大量位图以形成一个大的位图。

我使用软引用来允许正确存储这些位图。您可以在 android OS < 2.3 上毫无问题地滚动它们但是,一旦您达到 2.3 或更高版本,Android 的软参考集合变得更加激进。由于发生这种情况,该应用程序在这些较新的手机上运行非常缓慢。

我在这里看到这是一个记录在案的问题:

http://code.google.com/p/android/issues/detail?id=20015

有人知道解决这个问题的好方法吗?应用程序在较新的手机上运行得更差,这太荒谬了!谢谢您的帮助。

0 投票
5 回答
5339 浏览

java - 何时在 Java 中使用 Wea​​k 和 Phantom 引用

我阅读了很多文章,但我不明白 - 在实践中我需要在哪里使用 Wea​​k 和 Phantom 引用?据我了解,软引用 - 是缓存的不错选择。但是虚弱又虚幻,不知道什么时候用。请提供我们需要使用它们的实际任务的示例。

0 投票
3 回答
465 浏览

java - 一个知道可达性的缓存

我想要一个最大保留容量为 N 的缓存。我允许它最多容纳 N 个对象,否则这些对象将有资格进行 GC。现在,如果我的应用程序本身当前持有 N+1 对之前添加到缓存中的对象的强引用,我希望缓存也持有 N+1。为什么?因为缓存不会比其他情况更长时间地阻止这个 N+1th 对象被收集,而且我可以用更大的哈希表来换取更多的缓存命中。

另一种说法是,我想要一个对象缓存,它保留添加到其中的所有对象,同时它们保持强可达性,并且还保留足够的非强可达性对象以保持其大小 == N。

例子

我们创建了一个 N=100 的缓存。大小从 0 开始。添加了 150 个对象,大小为 150。这些对象中的 100 个变得非强可达(弱,软,等等)。缓存驱逐其中的 50 个并保留 50 个,大小为 100。添加了 49 个更强大的可达对象。大小仍然是 100,但现在其中 99 个是强可达的,只有一个是非强可达的。发生的事情是 49 个旧的、非强可达的对象被新的 49 个替换,因为新的对象是强可达的。

动机

我怀疑对于许多用例来说,这实际上是一件直观的事情。通常,缓存的容量会权衡缓存命中概率以保证最大内存使用。了解它所持有的对象的可达性后,缓存可以在不改变其最大内存使用保证的情况下提供更高的缓存命中概率。

麻烦

我担心这在JVM上是不可能的。我希望别人告诉我,但如果你知道一个事实是不可能的,如果有理由的话,我也会接受这个答案。

0 投票
2 回答
418 浏览

java - When using weak or soft reference with a ReferenceQueue when is the object really removed from memory?

When using weak or soft reference with a ReferenceQueue when is the object really removed from memory? Do I have to call referancequeue.remove or referancequeue.poll() methods?

Example:

or do I have to following?