3

全部,

我们的测试项目有问题抛出 OOM 异常,我怀疑问题出在我们身上。我们以某种方式持有引用,并且永远不会释放内存。

所以,我想运行一个内存分析器,看看这是在哪里发生的。

设置分析器工具很简单,只需将工具指向 nunit-console.exe 并运行我们的测试项目并拍摄一些快照。

不幸的是,这不起作用。我已经尝试了 SciTech 和演示的 ANTS,并且都高兴地报告说 NUnit 控制台程序集/appdomain/whatever 没有增长。伟大的。任务管理器中的进程稳步增长到 450MB,但内存分析器报告它根本没有增长。

伟大的。

我用谷歌搜索过,我看到了一些(特定于工具的)关于如何处理单元测试项目的简单说明。我已经尝试过这些东西,但它们没有用。我尝试过使用 NUnit 的 appdomain/assembly 设置,但到目前为止无济于事。

所以。

有没有人真正成功地针对测试项目(任何类型的——我们使用 NUnit,但我敢打赌它对于任何 .NET 自动化测试框架都是一样的)运行内存分析器?对于任何 .NET 测试框架?如果是这样,哪些说明对您有用?

4

4 回答 4

3

当我们在使用单元测试对我们的应用程序进行故障排除时遇到问题(我们使用的一些库不喜欢在单元测试环境中运行),我们只需创建一个控制台应用程序,它以与单元测试框架相同的顺序调用测试方法。然后,您在控制台应用程序上启动探查器。

您可能不需要运行所有测试来找出泄漏是什么。

我们还遇到了在托管内存跟踪工具中并不总是可见的非托管内存泄漏。您需要专门寻找非托管内存。这些通常是由于缺少 Dispose() 调用造成的。

于 2011-11-09T20:12:33.377 回答
0

您应该尝试 JetBrains MemoryProfiler(我使用的是 3.5 版)它在 NUnit(GUI 版)上运行良好!

于 2011-11-17T03:56:21.160 回答
0

我使用了最新版本的 RedGate ANTS (v9.5.0.853),它通过 NUnit (v2.6.2) 正确(并且轻松地)分析了我的 .NET 库。

您需要将 EXE 设置为作为 NUnit exe 启动...而且我针对我的 DLL 中的一个特定功能(“Portal.Interface.dll”)。

我创建了新的个人资料会话;

  • .NET 可执行文件的路径:C:\Program Files (x86)\NUnit 2.6.2\bin\nunit-x86.exe
  • 命令行参数:Portal.Interface.dll /fixture:Portal.Interface.Tests.TestSerializingSpeed
  • 工作目录:

然后我用最高分析方法运行它。

它产生了我期待的泄漏结果......

于 2016-10-26T02:09:09.200 回答
-1

您是否确保已考虑所有类型的分配,包括非托管内存?

顺便说一句,OutOfMemoryException当根本没有可用内存时,不一定会抛出。它有时是由某些想要分配大块连续内存块的类抛出的,例如StringBuilder. XmlDocument.SelectNodes偶尔扔它。

不幸的是,这是你无能为力的事情。如果应用程序很忙,垃圾收集器有权坐下来拒绝释放内存,并且找不到要分配的连续块的可能性会增加。

编辑#1

我可能记错了(怪啤酒),但您观察到的情况也可以通过垃圾收集器报告它已释放对象的事实来解释,但操作系统的内存管理器还没有完全释放以前占用的内存。与 .NET 垃圾收集器相比,它甚至更有资格做它的感觉。这类问题的最佳解决方案是围绕任何试图分配大量值类型的东西进行设计,尤其是System.String.

于 2011-11-09T20:34:17.200 回答