什么时候应该使用弱引用?

我最近遇到了一段带有WeakReferences的Java代码 - 我从来没有看到过他们的部署,尽管我在介绍时会遇到他们。 这是应该常规使用还是只有当遇到内存问题时才应该使用? 如果是后者,他们是否可以很容易地翻新或代码是否需要重构? 一般的Java(或C#)程序员可以忽略它们吗?

编辑可以通过过度热心地使用WR来完成任何损害吗?


弱引用都是关于垃圾收集的。 一个标准对象不会“消失”,直到所有对它的引用都被切断,这意味着在垃圾收集之前,你的各种对象必须删除的所有引用都将被视为垃圾。

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

一个例子:如果我的应用程序中有一堆Foo对象,我可能想使用Set来保存所有Foo的中心记录。 但是,当我的应用程序的其他部分通过删除所有对它的引用来删除一个Foo对象时,我不希望剩余的引用Set保持该对象以防止垃圾收集! 真的,我只想让它从我的集合中消失。 这就是你使用Weak Set(Java有一个WeakHashMap)的地方,它使用弱引用而不是“强”引用。

如果你的对象在你想要的时候没有被垃圾收集,那么你在你的书籍中犯了一个错误,但是仍然有一个你忘记删除的引用。 使用弱引用可以减轻此类记账的痛苦,因为您不必担心它们使对象“活着”并且不被垃圾收集,但是您不必使用它们。


只要你想有一个对象的引用而不需要自己保持对象的存在,就可以使用它们。 许多类似缓存的功能都是如此,但是在事件处理中也扮演着重要的角色,在这种情况下订阅者不会因订阅事件而保持活跃。

一个小例子:刷新一些数据的定时器事件。 任何数量的对象都可以在定时器上订阅以获得通知,但他们在定时器上订阅的事实不应该让它们保持活跃状态​​。 所以计时器应该对对象有弱引用。


过度热情地使用WR可以造成任何损害吗?

是的,它可以。

一个令人担忧的问题是,弱引用使你的代码更加复杂并且容易出错。 任何使用弱引用的代码都需要处理引用在每次使用时都被破坏的可能性。 如果你过度使用弱引用,你最终会写很多额外的代码。 (您可以通过隐藏每个弱引用来监视检查的方法,并根据需要重新创建丢弃的对象,从而缓解这种情况,但这可能不一定那么简单;例如,如果重新创建过程涉及网络访问,您需要应对重新创建失败的可能性。)

第二个问题是使用弱引用会导致运行时开销。 最明显的成本是指创建弱引用和调用的get他们。 不太明显的成本是每次GC运行时都需要完成大量的额外工作。

最后一个问题是,如果您将应用程序未来可能需要的某些内容用于较弱的引用,则可能会产生反复重新创建它的代价。 如果成本很高(就CPU时间,IO带宽,网络流量而言),您的应用程序可能会因此而导致性能下降。 给JVM增加内存并且不要使用弱引用可能会更好。

当然,这并不意味着你应该完全避免使用弱引用。 只是你需要仔细思考。 可能你应该首先在应用程序上运行一个内存分析器来确定你的内存使用问题源于哪里。

链接地址: http://www.djcxy.com/p/6423.html

上一篇: When should weak references be used?

下一篇: Sort ArrayList of custom Objects by property