我有一个应用程序存在大量内存泄漏。例如,如果打开一个视图并关闭它 10 次,我的内存消耗会增加,因为视图没有完全清理。这些是我的内存泄漏。从测试驱动的角度来看,我想编写一个测试来证明我的泄漏,并(在修复泄漏之后)断言我修复了它。这样我的代码以后就不会被破坏。简而言之:
有没有办法断言我的代码没有从单元测试中泄漏内存?
例如我可以做这样的事情吗:
objectsThatShouldNotBeThereCount = MemAssertion.GetObjects<MyView>().Count;
Assert.AreEqual(0, objectsThatShouldNotBeThereCount);
我对分析不感兴趣。我使用 Ants profiler(我非常喜欢),但也想编写测试以确保“泄漏”不会再次出现
我正在使用 C# / Nunit,但对任何对此有哲学的人感兴趣......
当托管类型不加小心地使用非托管资源时,通常会导致内存泄漏。
一个典型的例子是System.Threading.Timer
它采用回调方法作为参数。因为计时器最终使用非托管资源,所以引入了新的 GC 根,只能通过调用计时器的Dispose
方法。在这种情况下,你的类型也应该实现IDisposable
否则这个对象永远不会被垃圾收集(泄漏)。
您可以通过执行类似以下操作来为此场景编写单元测试:
var instance = new MyType();
// ...
// Use your instance in all the ways that
// may trigger creation of new GC roots
// ...
var weakRef = new WeakReference(instance);
instance.Dispose();
instance = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Assert.IsFalse(weakRef.IsAlive);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)