1

MSDN:

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

当您使用弱引用时,应用程序仍然可以获得对该对象的强引用,这会阻止它被收集。但是,在重新建立强引用之前,垃圾收集器总是有可能首先到达对象。

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

4

3 回答 3

5

你误读了文字。当它说

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

它的意思是

如果

您有一个使用大量内存但可以轻松重新创建的对象

然后

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

于 2012-08-23T09:39:59.740 回答
3

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

弱引用不会阻止对象被垃圾回收,因此可能会收集持有大量内存的对象,以便可以重用内存。但是,如果收集的对象重新创建使用弱引用的好处是昂贵的,并且在使用对象时让对象被垃圾收集的好处就会丢失,并且由于对象被收集而需要重新创建。

于 2012-08-23T09:35:34.760 回答
0

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

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

在决定是否使用 a时,一个人应该决定如果在没有其他引用对其目标的那一刻,它变得无效,WeakReference是否会感到高兴。WeakReference如果一个人想WeakReference保持一段时间的有效性,这表明一个人可能应该使用其他一些缓存机制。

于 2012-10-11T22:18:41.927 回答