【问题标题】:Tracing objects that SHOULD be collected for logic purposes跟踪应该出于逻辑目的收集的对象
【发布时间】:2012-09-07 21:08:58
【问题描述】:
  1. 我的字典中填充了 WeakReferences。
  2. Web 服务 A:创建对象并将其放置在弱引用字典中。 (1)
  3. Web 服务 A 有时会保留具有强引用的对象,有时则不会。

我的问题:

我无法跟踪应该从弱引用字典中删除的对象,因为垃圾收集器不会立即收集它们,它只会在随机且不可预测的时间后收集。

行为不一致,例如

示例 1:按预期工作,立即收集变量 ex1。

Sub Example1(id as integer)
Dim ex1 as new Object
dim t as new WeakReference With {.target = ex1};
WeakReferenceDictionary.add(id,ex1)
End Sub<br>

Example2 '这不起作用,ext1 没有立即收集

Sub Example1(id as integer)
  Dim ex1 as new Object
  dim t as new WeakReference With {.target = ex1};
  WeakReferenceDictionary.add(id,ex1)

  otherclass.refObject = ex1
  otherclass.refObject = Nothing

End Sub<br>

我试过了。
将 WeakDictionary 放在 Module1 中(是一个控制台应用程序)。
GC.收集
GC.Collect(0)
GC.Collect(1)
GC.Collect(2)

我的问题。 无论如何,即使它会降低我的应用程序的性能,是否真的强制进行垃圾收集。我知道我不应该将 GC 用于逻辑目的,但对于我的解决方案来说,这样做真的很方便。

【问题讨论】:

  • 当然可以……我自己并不喜欢这种解决方案,但我只需要在这些对象没有被任何应用程序引用的记录器时跟踪它们。在所有应用程序中实现引用计数器将是一项巨大的工作,使用垃圾收集算法肯定会更加简单、优雅和可靠。我只是想知道是否有一种方法可以真正强制它,而不仅仅是向 GC 提出建议。

标签: .net garbage-collection weak-references


【解决方案1】:

我将以免责声明开始这篇文章:我非常怀疑您是否选择了正确的方法来依赖垃圾收集内部,因为不能保证,不可预测,即使现在测试可以工作,您的代码也可能会中断任何 .NET 补丁版本。

您的对象可能未被收集的原因有多种:

  1. 您正在调试器下运行或已内置调试模式。这将稍微延长对象的生命周期(JIT 不会急切地将变量内容标记为未使用,以便即使变量超出范围,您也可以调试变量)。
  2. 您将 GC.Collect 调用置于错误的位置
  3. 您没有调用 WaitForPendingFinalizers,尽管您的对象有一个

也许还有其他原因。

那么如何解决这个问题?不要依赖GC。依赖确定性操作,例如实现和调用 Dispose 或切换到引用计数技术。

【讨论】:

  • 感谢您的及时回复,我已经在发布模式下对其进行了测试,即使在 VisualStudio 之外,行为仍在继续。 WaitForPendingFinalizers 方法对我不起作用,因为它会停止线程(必须能够同时运行)。至于实现 poupuses,我对这些对象的 Finalize 方法有逻辑,但是当它们应该调用它们时,它们不会被调用。至于你的免责声明,我完全同意你的看法。我不应该搞乱GC。但我们无法找到更好的解决方案。
【解决方案2】:

感谢 exaceratedexpert; 阅读文章 www.sellsbrothers.com/writing/refcount_rotor.doc,发现真正强制 GC 确保所有应该被释放的对象实际上都以可预测的方式被释放是不切实际的。

必须实现引用计数器(如文章所示)。

我发现的另一个解决方案是创建一个包含已创建的特定类的所有对象的数组,然后使用根节点通过反射执行第二次查看,然后比较两者并找出谁是missig。这种方法将确保获得干净一致的结果,但会消耗太多资源,不得不进行完整的根子扫描。

感谢两位的回答。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
  • 2018-09-01
相关资源
最近更新 更多