根据本文的第8步,我编写了以下简单的单元测试,以确保我的Test
类不会导致内存泄漏:
private class TestClass
{
}
[TestMethod]
public void MemoryLeakTest()
{
vat testObj = new TestClass();
var weakRef = new WeakReference(testObj)
testObj = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Assert.IsFalse(weakRef.IsAlive);
}
测试在代码存储库的master分支中通过,但当我在另一个功能分支中运行测试时,测试失败。所以我有两个问题:
- 这个方法能可靠地检测类的内存泄漏吗
- 什么情况会导致此测试在一个分支中通过而在另一个分支失败
这个测试很少有有用的地方。所有这些都涉及Test
的构造函数对全局变量进行某种注册(要么在全局事件上注册自己,要么将this
指针存储在静态成员中(。由于这是很少做的事情,所以对所有类进行上述测试是过度的。此外,该测试没有涵盖C#中更典型的内存泄漏情况:构建数据结构(例如List(,并且从不清理它。
此测试可能会失败,原因有很多:GC.Collect()
不一定强制清除所有垃圾。这是应该的,但不能保证它会一直发生。此外,由于testObj
是一个局部变量,当您调用GC.Collect()
时,它还没有超出范围,因此根据代码的优化方式,该变量还不能被视为垃圾,这会导致测试失败。