【问题标题】:c# Check Garbage Collection [duplicate]c#检查垃圾收集[重复]
【发布时间】:2015-05-15 14:35:46
【问题描述】:

有没有办法检查 GC 收集了哪些实例类,哪些没有? 我发现的一个选项是通过测试检查类,如下所述:

How can I write a unit test to determine whether an object can be garbage collected?

【问题讨论】:

  • 你在哪里需要这个?
  • 类不被 GC 收集,但所有类的实例都是。一般来说,您可以通过对其进行弱引用并查看它是否仍然存在来测试集合,但如何最好地做到这一点可能取决于您的需要。
  • @JonHanna,对不起,错过了“实例”这个词。我正在尝试以正确的方式编写代码并避免内存泄漏。所以我想检查哪些实例仍然“活着”,即使我没有使用它们并且应该收集它们。

标签: c# garbage-collection


【解决方案1】:

有什么方法可以检查哪些类被 GC 收集了,哪些没有?

不,因为要检查一个对象,您仍然需要对它的引用,这会阻止它的收集。

您可以使用 Wea​​kReferences 构建管理,但这会很笨拙且成本高昂。当然不是对所有对象都可行。

更重要的是,你不应该需要这个。如果你认为你这样做了,分析一下那个思路。

【讨论】:

    【解决方案2】:

    创建一个 ReferenceTester 类,该类将持有 A Dictionary of week 引用 字典使用它们来测试类是否存在。 然后调用 GC.Collect()。

    如果课程还在,请再次检查ReferenceTester

    【讨论】:

      【解决方案3】:

      您还可以通过调用终结器来判断对象何时被垃圾收集。这不是 100% 保证的,因为您仍然在会阻止收集的类上调用 GC.SupressFinalize()。

      【讨论】:

      • 没有调用终结器的原因有很多,SuppressFinalize() 是其中最少的一个。无法保证会调用终结器。
      • 而且拥有一个终结器(析构函数)非常昂贵。您不希望在所有(许多)对象上都使用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多