【问题标题】:Using Sos (dumpheap etc) from test code?从测试代码中使用 Sos(dumpheap 等)?
【发布时间】:2011-04-20 11:29:45
【问题描述】:

我最近在我的应用程序中发现了内存泄漏,我想添加一个测试用例来检查它是否保持这种状态。我想做的是这样的:

 int numberOfInstancesBeforeFunction = GetNumberOfInstancesInMemory(typeof(MyClass));

 PerformFunction();

 GC.Collect();

 int numberOfInstancesAfterFunction = GetNumberOfInstancesInMemory(typeof(MyClass));

 Assert.AreEqual(numberOfInstancesBeforeFunction, numberOfInstancesAfterFunction, "mem leak");

这可能吗?

谢谢,

【问题讨论】:

  • 你有没有找到一种从代码中实际控制sos的方法?我希望能够做的不仅仅是引用计数......

标签: .net memory garbage-collection memory-leaks


【解决方案1】:

在@Adam Robinson here 接受的答案中,有关于如何使用WeakReference 实现此目的的建议。

GetNumberOfInstancesInMemory 必须检查MyClass 对象WeakReferences 的静态容器,以查看有多少返回thisReference.IsAlive = true;(并删除任何具有isAlive = false 的容器。

MyClass 的任何构造都会向静态容器添加对自身的引用。

我认为有一种优雅的 Linq 方法可以封装所需的逻辑。

我不知道是否有任何方法可以在不将额外代码添加到您的 MyClass 中的情况下做到这一点。

【讨论】:

  • @Euan - 很好,但请注意@Hans Passant 的警告,在此过程中会引入新的泄漏。经典的 Heisenbug 机会。
猜你喜欢
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2015-05-23
  • 2012-10-18
相关资源
最近更新 更多