由于垃圾收集器可以随时声明弱引用,是否有任何实际的理由使用它们?
答案 0 :(得分:44)
如果您希望保留对某些内容的引用,只要它在其他地方使用,例如一个监听器,你可以使用弱引用。
WeakHashMap可以用作派生数据的密钥的短期缓存。它还可以用于保存有关其他对象的信息,并且您不知道何时丢弃这些对象。
BTW Soft References就像弱引用一样,但不会立即清除它们。 GC将始终丢弃弱引用,并尽可能保留软引用。
还有另一种称为幻影参考的参考。这在GC清理过程中使用,并且指的是“正常”代码无法访问的对象,因为它正在被清理。
答案 1 :(得分:28)
由于垃圾收集器可以在任何时候声称弱引用,是否有任何实际的理由使用它?
当然有使用它的实际原因。如果框架设计者花费巨大的代价来构建一个“不实用”的虚拟参考系统,那么你会不会觉得奇怪?
我认为您打算提出的问题是:
人们使用弱引用的现实情况是什么?
有很多。常见的是实现性能目标。在对应用程序进行性能调整时,通常必须在更多内存使用和更多时间使用之间进行权衡。假设有一个复杂的计算,你必须多次执行,但计算是纯粹的" - 答案仅取决于论据,而不取决于外生状态。您可以构建一个缓存 - 从参数到结果的映射 - 但然后使用内存。你可能永远不会再问这个问题,然后就会浪费内存。
弱引用可能解决了这个问题;缓存可能会变得非常大,因此如果多次询问相同的问题,则会节省时间。但是如果缓存变得足够大以至于垃圾收集器需要回收空间,那么它可以安全地进行。
缺点当然是垃圾收集器的清理策略被调整为满足整个系统的目标,而不是特定的缓存问题。如果GC策略和您想要的缓存策略充分对齐,那么弱引用是解决此问题的高度实用的解决方案。
答案 2 :(得分:13)
如果WeakReference是仅对象的引用,并且您希望该对象闲逛,则应该使用SoftReference代替。
WeakReferences最好用于会有对该对象的其他引用的情况,但是您不能(或不希望)检测何时不再使用这些其他引用。然后,其他引用将阻止对象被垃圾收集,而WeakReference将只是另一种获取同一对象的方式。
两个常见用例是:
答案 3 :(得分:12)
我们出于这个原因使用它 - 在我们的示例中,我们有各种必须注册服务的侦听器。该服务保持对侦听器的弱引用,而实例化的类保留强引用。如果这些类在任何时候得到GC,那么弱引用就是听众的剩余部分,然后它也将被GC控制。它使得更容易跟踪中间类。
答案 4 :(得分:8)
弱引用的最常见用法是“查找”映射中的值。
使用普通(硬)值引用,如果映射中的值不再在其他地方引用它,则通常不再需要查找。对于弱引用的映射值,一旦没有其他引用,该对象就成为垃圾收集的候选者
地图本身有一个(唯一的)对象引用的事实不会阻止它被垃圾收集,因为引用是弱引用
答案 5 :(得分:3)
为防止内存泄漏,请参阅此article了解详细信息。
答案 6 :(得分:3)
弱引用是一个引用,它不保护引用对象不被垃圾收集器收集。
答案 7 :(得分:2)
我通常将它用于某种类型的缓存。最近访问的项目立即可用,如果缓存未命中,则重新加载项目(DB,FS,等等)。
答案 8 :(得分:0)
我使用WeakSet
对图表中的链接进行编码。如果删除节点,链接将自动消失。