MSDN:
弱引用对于使用大量内存的对象很有用,但是如果垃圾回收可以很容易地重新创建它们。
和
当您使用弱引用时,应用程序仍然可以获得对对象的强引用,从而阻止它收集。然而,垃圾总是有风险的收集器将在强引用之前首先到达对象重建。
我的问题是:为什么WeakReference对象可以很容易地重新创建?GC发布后,与普通对象相比,是否可以轻松地重新创建?
您误读了文本。当它说
弱引用对于使用大量内存的对象很有用,但如果垃圾回收可以很容易地重新创建它们。
意思是
如果
你有一个使用大量内存但很容易重新创建
然后
对这个物体的微弱参考可能是有用的
没有区别,MSDN文档试图描述弱引用的用例,也就是说,弱引用应该与使用大量内存但同时易于重新创建的对象关联使用。
弱引用不会阻止对象被垃圾收集,因此可能会收集持有大量内存的对象,以便重用内存。但是,如果所收集的对象重新创建的成本很高,那么使用弱引用和让对象被垃圾收集的好处在使用该对象时就会丢失,并且由于该对象已被收集,因此需要重新创建。
弱引用的主要正确使用是在这样的情况下:一个引用是否有用的决定因素是其他人是否持有对同一事物的引用。此类情况的两个常见示例:
- 如果一个对象Foo为了其他对象的利益而以某种方式更新或操纵Bar,那么它可能对Bar有一个弱引用,但如果没有人关心Bar是否更新,那么它也就不麻烦了。如果真正关心Bar的对象持有对它的强引用,而不关心它的对象持有弱引用,那么一旦没有人关心Bar,它将有资格被收集,弱引用将无效,持有这种引用的对象将发现他们不再需要处理Bar。
- 如果一个对象构建了一个大型的不可变对象,并发现它与已经存在引用的对象精确匹配,那么放弃新建的对象并用引用替换后一个对象可能会有所帮助。这将节省内存,也可能大大加快比较(比较两个恰好相同的不同大对象可能会很昂贵,但比较同一大对象的两个引用非常便宜)。只要其他人需要,缓存对大对象的引用是很有帮助的,但是,当不存在其他引用时,将对象保留在缓存中实际上会适得其反(如果没有其他内容包含对缓存副本的引用,那么与放弃缓存副本并保留新副本相比,放弃新副本并保留缓存副本几乎没有好处;因此,将新副本与缓存副本进行比较,以确定是否可以使用缓存副本并放弃新副本将是浪费时间)。
在决定是否使用WeakReference
时,应该决定如果WeakReference
在不存在对其目标的其他引用的情况下被无效,人们是否会感到高兴。如果希望WeakReference
在一段时间内保持有效,这表明可能应该使用其他缓存机制。