弱引用是否有实际用途?

时间:2012-01-09 15:09:08

标签: java garbage-collection weak-references

  

可能重复:
  Weak references - how useful are they?

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

9 个答案:

答案 0 :(得分:44)

如果您希望保留对某些内容的引用,只要它在其他地方使用,例如一个监听器,你可以使用弱引用。

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

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

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

答案 1 :(得分:28)

  

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

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

我认为您打算提出的问题是:

  

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

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

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

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

答案 2 :(得分:13)

如果WeakReference对象的引用,并且您希望该对象闲逛,则应该使用SoftReference代替。

WeakReferences最好用于会有对该对象的其他引用的情况,但是您不能(或不希望)检测何时不再使用这些其他引用。然后,其他引用将阻止对象被垃圾收集,而WeakReference将只是另一种获取同一对象的方式。

两个常见用例是:

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

答案 3 :(得分:12)

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

答案 4 :(得分:8)

弱引用的最常见用法是“查找”映射中的值。

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

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

答案 5 :(得分:3)

为防止内存泄漏,请参阅此article了解详细信息。

答案 6 :(得分:3)

弱引用是一个引用,它不保护引用对象不被垃圾收集器收集。

  • 考虑仅由弱引用引用的对象 无法到达(或“弱可达”),因此可以在任何地方收集 时间。
  • 弱引用用于避免保留引用的内存 不需要的物品。一些垃圾收集语言的功能或支持 各种级别的弱引用,例如Java,C#,Python,Perl或 口齿不清。
  • 垃圾收集用于减少内存泄漏的可能性 和数据损坏。垃圾收集有两种主要类型: 跟踪和引用计数。参考计数方案记录了 对给定对象的引用数量,并在何时收集对象 引用计数变为零。参考计数无法收集 循环(或循环)引用,因为只有一个对象 一次收集。相互引用的对象组 因此,不能被其他对象直接引用并且无法访问 永久居住;如果应用程序不断生成 这样的无法到达的无法访问的对象组 内存泄漏的影响。 弱引用可用于解决问题 如果避免参考循环,循环引用的问题 对组内的某些引用使用弱引用。
  • 弱引用也用于最小化不必要的数量 通过允许程序指示哪些对象在内存中的对象 只是微弱地引用它们并不重要。

答案 7 :(得分:2)

我通常将它用于某种类型的缓存。最近访问的项目立即可用,如果缓存未命中,则重新加载项目(DB,FS,等等)。

答案 8 :(得分:0)

我使用WeakSet对图表中的链接进行编码。如果删除节点,链接将自动消失。