为什么弱引用对象可以轻松重建?

时间:2012-08-23 09:29:41

标签: .net garbage-collection weak-references

MSDN:

  

弱引用对于使用大量内存的对象很有用,但是   如果它们被垃圾收集回收,可以很容易地重新创建。

  

当您使用弱引用时,应用程序仍然可以获得   强烈引用该对象,阻止它成为   集。但是,垃圾总是存在风险   收集器将在强引用之前首先到达对象   重新建立。

我的问题是:为什么可以轻松地重新创建WeakReference对象? GC发布后,与普通对象相比,可以轻松地重新创建吗?

3 个答案:

答案 0 :(得分:5)

你误读了文字。什么时候说

  

弱引用对于使用大量内存的对象很有用,但如果它们被垃圾回收回收,则可以轻松地重新创建。

意味着

  

如果

     

你有一个使用大量内存的对象,但很容易   重新创建

     

THEN

     

对此对象的弱引用可能很有用

答案 1 :(得分:3)

没有区别,MSDN文档试图描述弱引用的用例,即弱引用应该与使用大量内存但同时使用的对象相关联时间很容易被重建。

弱引用不会阻止对象被垃圾回收,因此可以收集占用大量内存的对象,以便可以重用内存。但是,如果收集的对象很难重新创建使用弱引用的好处并且让对象被垃圾收集在使用该对象时丢失,并且因为收集了对象而需要重新创建。

答案 2 :(得分:0)

弱引用的主要正确用法是在引用是否可能有用的决定因素是其他人是否持有对同一事物的引用。这种情况的两个常见例子是:

  1. 对象Foo可能会保留对Bar的弱引用,如果期望以某种方式更新或操纵Bar *以利于其他对象*,但如果没有人关心Bar是否更新或者不。如果真正关心Bar的对象拥有对它的强引用,而那些不关心它的对象持有弱引用,那么一旦没有人关心Bar,它将有资格进行收集,弱引用将被无效,并且对象持有此类参考资料会发现他们不再需要与Bar打交道。
  2. 如果一个对象构建了一个大的不可变对象,并发现它与已经存在的引用精确匹配,那么放弃新构建的对象并将引用替换为后者可能会有所帮助。这将节省内存,并且还可以大大加快比较(比较碰巧相同的两个不同的大对象可能是昂贵的,但比较两个对同一大对象的引用是非常便宜的)。只要其他人需要它就缓存对大对象的引用是有帮助的,但是当没有其他引用存在时将对象保留在缓存中实际上会适得其反(如果没有别的东西持有对缓存副本的引用,那么就会放弃新副本并保留缓存副本与放弃缓存副本并保留新副本相比很少或没有优势;因此将新副本与缓存副本进行比较以确定是否可以使用缓存的副本放弃新副本会是浪费时间)。

在决定是否使用WeakReference时,如果WeakReference在其目标没有其他参考的情况下失效,则应该决定是否会感到高兴。如果有人希望WeakReference在一段时间内保持有效,那就表明应该使用其他一些缓存机制。