短弱引用和长弱引用有什么区别?

7
我知道以下知识:
弱引用允许垃圾回收器在仍然允许应用程序访问对象的情况下收集对象。因此,如果对象已被回收,当需要时必须重新创建它。
那么,短弱引用和长弱引用有什么区别?我认为如下(根据msdn):
- 短弱引用:如果GC回收对象,则该对象真正被释放。 - 长弱引用:如果GC回收对象,则该对象仍然存在(因为它被缓存)。
那么,有人能告诉我更多细节吗?

1
这里有很好的解释:https://dev59.com/pHVC5IYBdhLWcg3wYQEp - Kamil T
1个回答

4

简短版

当对象被垃圾回收时,短弱引用的目标将变为null。弱引用本身是托管对象,与任何其他托管对象一样受到垃圾回收的影响。短弱引用是WeakReference的默认构造函数。

详细版

长弱引用在对象的Finalize方法被调用后仍然保留。这允许对象被重新创建,但对象的状态仍然不可预测。要使用长引用,请在WeakReference构造函数中指定true。

如果对象的类型没有Finalize方法,则适用短弱引用功能,并且弱引用仅在目标被收集之前有效,这可能发生在finalizer运行之后的任何时间。

要建立强引用并再次使用对象,请将WeakReference的Target属性转换为对象的类型。如果Target属性返回null,则对象已被回收;否则,您可以继续使用该对象,因为应用程序已重新获得对它的强引用。

使用弱引用的指南

仅在必要时使用长弱引用,因为对象的状态在最终化后是不可预测的。避免将弱引用用于小对象,因为指针本身可能与或更大。

避免将弱引用作为内存管理问题的自动解决方案。相反,开发有效的缓存策略来处理应用程序的对象。

参考资料


我已经知道这篇文章了,但我的问题是,如果GC回收对象,那么对象还存在吗? - roast_soul
2
我不明白为什么那个文档描述得如此之差?一个短弱引用将在其目标变为立即终结状态或不存在时失效,或者当弱引用本身变为可终结状态时也同样失效。一个长弱引用会在其目标不存在时失效,或者当弱引用本身变为可终结状态时也同样失效。请注意,弱引用可能会在其目标存活的同时失效-这一点在文档中没有提到! - supercat
@supercat 简短的弱引用和长的弱引用都有相同的失效条件:当它们的目标不存在或弱引用本身被回收时!它们之间有什么区别? - Shahryar Saljoughi
@ShahryarSaljoughi:我刚刚描述了区别。一个变得符合立即终结条件的对象需要一直存在,直到终结完成,但对它的短弱引用会立即失效。 - supercat
如果对象没有终止器会怎样?短弱引用和长弱引用之间有什么区别? - kaalus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接