【问题标题】:MSTest OutOfMemory ExceptionMSTest OutOfMemory 异常
【发布时间】:2016-04-26 09:41:35
【问题描述】:

问题:

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

当我一次运行所有这些时,单元测试运行接近尾声的一些测试开始失败,并显示 System.OutOfMemoryException

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

分析:

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

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

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

问题:

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

有没有人遇到过这种情况或者可以指出我应该/可以做些什么来解决或定位问题?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    我们遇到了类似的问题: 事实证明,当使用 TFS 和 Visual Studio 测试代理部署和运行功能测试任务在我们的 CI 服务器上运行测试并且使用发布(而不是调试)完成构建时,测试运行程序似乎不会在每次测试后收集内存。 我们在 testcleanup 中添加了手动清理和手动 GC 收集,而不是出现内存不足异常 ~1.5GB 内存使用量,我们现在保持在 300MB 左右的内存使用量。

    【讨论】:

    • 谢谢,这是我肯定会尝试的,虽然从那以后我们稍微改进了一些,但问题仍然可能时不时出现。
    • 我们在多阶段构建中使用了 tfs2018 中的新测试运行程序,因为在我们发现问题之前,该测试运行程序可以同时使用更多内存作为解决方法。
    【解决方案2】:

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

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

    然后用dotMemory profiler 打开这个快照,看看是什么浪费了内存。 另请查看大对​​象堆,您可能遇到了碎片问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-28
      • 2018-06-18
      • 2015-04-25
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      相关资源
      最近更新 更多