弱引用是否有实际用途?

use*_*949 94 java garbage-collection weak-references

可能重复:
弱引用 - 它们有用吗?

由于垃圾收集器可以随时声明弱引用,是否有任何实际的理由使用它们?

Pet*_*rey 45

如果您希望保留对某些内容的引用,只要它在其他地方使用,例如Listener,您就可以使用弱引用.

WeakHashMap可以用作派生数据的密钥的短期缓存.它还可以用于保存有关其他对象的信息,并且您不知道何时丢弃这些对象.

BTW Soft References就像弱引用一样,但它们并不总是立即清理.GC将始终丢弃弱引用,并尽可能保留软引用.

还有另一种称为幻影参考的参考.这在GC清理过程中使用,并且指的是"正常"代码无法访问的对象,因为它在清理过程中.


Eri*_*ert 29

由于垃圾收集器可以在任何时候声称弱引用,是否有任何实际的理由使用它?

当然有使用它的实际原因.如果框架设计者花费巨大的代价来构建一个不切实际的弱参考系统,你会不会觉得奇怪?

我想你想问的问题是:

人们使用弱引用的现实情况是什么?

有许多.常见的是实现性能目标.在对应用程序进行性能调整时,通常必须在更多内存使用和更多时间使用之间进行权衡.例如,假设您必须执行多次复杂计算,但计算是"纯粹的" - 答案仅取决于参数,而不取决于外生状态.您可以构建一个缓存 - 从参数到结果的映射 - 但然后使用内存.你可能永远不会再问这个问题,然后就会浪费内存.

弱引用可能解决了这个问题; 缓存可能会变得非常大,因此如果多次询问相同的问题,则会节省时间.但是如果缓存变得足够大以至于垃圾收集器需要回收空间,那么它可以安全地进行.

缺点当然是垃圾收集器的清理策略被调整为满足整个系统的目标,而不是特定的缓存问题.如果GC策略和所需的缓存策略充分对齐,那么弱引用是解决此问题的高度实用的解决方案.

  • 弱(或软)引用不应该用作快速和脏的缓存,攻击性GC可能几乎立即驱逐引用,增益将为零.使用引用作为缓存将使程序依赖于GC算法或仅仅是GC的参数,并且无法可靠地预测. (9认同)
  • 这种特殊情况的问题在于,您希望GC以理想的方式运行,并执行优化算法固有的一些工作.我认为在最常见的GC策略实现中,对没有强引用的对象的弱引用将很快被吹走 - 通常在第一次GC传递时.我甚至会说使用强引用实现你自己对这些'答案'的跟踪更好,并使用你自己的领域知识和逻辑明确地删除它们. (5认同)

Bil*_*ell 14

如果WeakReference是对象的唯一引用,并且您希望对象挂起,则应该使用SoftReference.

WeakReferences最好用于会有对象的其他引用的情况,但是你不能(或不想要)检测何时不再使用那些其他引用.然后,另一个引用将阻止对象被垃圾收集,而WeakReference将只是另一种获取相同对象的方式.

两个常见用例是:

  1. 用于保存有关您无法直接修改的特定对象的额外(通常是昂贵计算但可重现的)信息,以及您无法控制其生命周期的信息.WeakHashMap是保存这些引用的完美方式:WeakHashMap中的键只是弱保存,因此当密钥被垃圾收集时,该值也可以从Map中删除,因此被垃圾收集.
  2. 为了实现某种事件或通知系统,其中"监听器"在某种协调器中注册,因此当发生某些事情时可以通知他们 - 但是当你不想阻止这些监听器被垃圾收集时他们生命的尽头.WeakReference将在它仍处于活动状态时指向该对象,但是一旦原始对象被垃圾收集,则指向"null".


Noa*_*oah 12

我们出于这个原因使用它 - 在我们的例子中,我们有各种必须注册服务的监听器.该服务保持对侦听器的弱引用,而实例化的类保留强引用.如果这些类在任何时候得到GC,那么弱引用就是听众的剩余部分,然后它也将被GC控制.它使得更容易跟踪中间类.


Boh*_*ian 8

弱引用的最常见用法是"查找"映射中的值.

使用普通(硬)值引用时,如果映射中的值不再在其他位置引用它,则通常不再需要查找.对于弱引用的映射值,一旦没有其他引用,该对象就成为垃圾收集的候选对象

地图本身具有(唯一)对象的引用这一事实不会阻止它被垃圾收集,因为引用是引用

  • *最常见的用法......*,这是不真实的.软弱的可能是真的,但绝对不是弱的.在保留真实参考将导致泄漏的情况下使用WeakReferences. (2认同)