【问题标题】:Why weakreference object can be recreated easily?为什么可以轻松地重新创建弱引用对象?
【发布时间】:2012-08-23 09:29:40
【问题描述】:

MSDN:

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

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

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

【问题讨论】:

  • 如果你知道被引用的对象很容易重新创建,你可以选择使用它。并不是说有什么神奇的东西可以让放置在其中的任何物体都易于重新创建。
  • 这并不是说使用弱引用就可以轻松地重新创建对象 - 而是说您应该对可以轻松重新创建的类使用弱引用b) 使用大量内存。

标签: .net garbage-collection weak-references


【解决方案1】:

您误读了文本。当它说

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

意思是

如果

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

那么

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我认为人们应该对不存在强引用的事物持有弱引用以希望创建强引用的想法通常被误导。我会假设,在 99.9% 的弱引用是合适的情况下,弱引用在对对象的最后一个强引用不再存在和下一个集合之间仍然有效的事实不是一个可取的特性,而是一个可以容忍的特性局限性。当弱引用被正确使用时,它的价值取决于其他强引用的存在。
    【解决方案3】:

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

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

    在决定是否使用WeakReference 时,应该确定如果WeakReference 在没有其他引用对其目标的那一刻失效,是否会感到高兴。如果有人希望WeakReference 保持有效一段时间,这表明人们可能应该使用其他一些缓存机制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2011-04-23
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      相关资源
      最近更新 更多