MSTest OutOfMemory例外

问题描述 投票:1回答:2

问题:

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

当我立刻运行所有这些时,接近单元测试运行结束时的一些测试开始失败,使用System.OutOfMemoryException

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

分析:

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

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

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

问题:

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

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

谢谢!

.net unit-testing memory-leaks out-of-memory mstest
2个回答
1
投票

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

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

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


1
投票

我们遇到了类似的问题:结果是,当我们使用TFS和Visual Studio测试代理部署和运行功能测试任务在CI服务器上运行测试时,构建是通过Release(而不是Debug)完成的,testrunner似乎没有收集每次测试后的记忆。我们在testcleanup上添加了手动清理和手动GC收集,而不是内存不足异常~1.5GB内存使用量,我们现在保持300MB内存使用率。

© www.soinside.com 2019 - 2024. All rights reserved.