何时应使用弱引用?

2022-09-02 11:31:37

我最近遇到了一段带有WeakReferences的Java代码 - 我从未见过它们被部署,尽管我在引入它们时遇到了它们。这是应该经常使用的东西,还是只有在遇到内存问题时才使用?如果是后者,它们是否可以轻松改造,或者代码是否需要认真重构?普通的Java(或C#)程序员通常可以忽略它们吗?

编辑过度热情地使用WR会造成任何损害吗?


答案 1

弱引用都是关于垃圾回收的。在分离对标准对象的所有引用之前,标准对象不会“消失”,这意味着在垃圾回收将其视为垃圾之前,必须删除各种对象对它的所有引用。

仅仅因为你的对象被其他对象引用而使用弱引用并不一定意味着它不是垃圾。它仍然可以被GC拾取并从内存中删除。

举个例子:如果我的应用程序中有一堆 Foo 对象,我可能想要使用 Set 来保存我周围所有 Foo 的中心记录。但是,当我的应用程序的其他部分通过删除对Foo对象的所有引用来删除它时,我不希望我的Set对该对象的剩余引用阻止它被垃圾回收!真的,我只想让它从我的布景中消失。在这里,你可以使用像弱集这样的东西(Java有一个WeakHashMap),它使用对其成员的弱引用而不是“强”引用。

如果你的对象在你想要的时候没有被垃圾回收,那么你在簿记中犯了一个错误,有些东西仍然包含你忘记删除的引用。使用弱引用可以减轻这种簿记的痛苦,因为你不必担心它们保持对象“活着”和未被垃圾收集,但你不必使用它们


答案 2

每当您希望对对象进行引用而不使对象保持活动状态时,都可以使用它们。对于许多类似缓存的功能来说,情况确实如此,但在事件处理中也起着重要作用,在事件处理中,订阅者不应通过订阅事件来保持活动状态。

一个小示例:刷新某些数据的计时器事件。任意数量的对象都可以在计时器上订阅以获得通知,但是它们在计时器上订阅的事实不应该使它们保持活动状态。因此,计时器应该具有对对象的弱引用。


推荐