MSTest OutOfMemory Exception

时间:2016-01-20 13:48:07

标签: .net unit-testing memory-leaks out-of-memory mstest

问题:

最近,我开始在我的一个项目中遇到一个问题,其中包含大约650个单元测试。

当我同时运行所有这些测试时,靠近单元测试运行结束时的一些测试开始失败并显示System.OutOfMemoryException

当我再次重新运行失败的测试时,它们会通过。

分析:

我在运行测试时查看了任务管理器,看到vstest.executionengine.x86.exe总是增加,直到达到1330 MB的内存。然后测试开始因内存不足而失败。

当然我确定我的一些类可能会有内存泄漏,但我测试的类中有90%没有这样的代码可能会导致内存泄漏。

我的许多测试类没有任何TestInitializeTestCleanup方法,因为我的类的创建是直接在TestMethod测试中完成的,因为那些测试的类没有实现IDiposable(因为没有可能导致泄漏的代码)。

问题:

现在我不确定我可能做错了什么。但是我想知道即使在测试类的所有测试都运行之后,测试对象如何保留在内存中?

有没有人经历过这个或者可以指出我应该/可以做些什么来修复或找到问题?

谢谢!

2 个答案:

答案 0 :(得分:1)

从测试项目中引用dotMemory Unit框架,并将以下代码添加到OOM发生之前(或接近OOM的某个地方)最后运行的测试中。

dotMemoryApi.GetSnapshot();
dotMemoryApi.SaveCollectedData();

然后使用dotMemory分析器打开此快照,查看内存的浪费。 另外看看大对象堆,它可能会出现碎片问题。

答案 1 :(得分:1)

我们有一个类似的问题: 事实证明,当使用TFS以及Visual Studio测试代理部署和运行功能测试任务在CI服务器上运行测试,并且构建是通过Release(而非Debug)完成时,每次运行测试后,testrunner似乎都不会收集内存。 我们在testcleanup上添加了一个手动清理操作和一个手动GC收集操作,而不是出现内存不足异常(〜1.5GB内存使用量),现在我们保持在300MB左右。