所有
我们的测试项目抛出OOM异常有问题,我怀疑问题在于我们。我们以某种方式持有引用,并且永远不会释放内存。
所以,我想运行一个内存分析器,看看发生了什么。
设置探查器工具很简单,只需将工具指向nunit-console.exe并运行我们的测试项目并拍摄一些快照即可。
不幸的是,这不起作用。我已经尝试了SciTech并演示了ANTS,并且两人都愉快地报告说NUnit控制台程序集/ appdomain /其他什么都没有增长。大。任务管理器中的过程稳步增长到450MB,但内存分析器报告它根本没有增长。
大
我已经google了,我已经看到了一些(工具特定的)简单说明,用于处理单元测试项目。我尝试过这些东西,但它们没有用。我试过玩NUnit的appdomain / assembly设置,但到目前为止无济于事。
所以
有没有人真正针对测试项目运行内存探查器(任何类型 - 我们使用NUnit,但我敢打赌它对于任何.NET自动化测试框架都是一样的)成功?对于任何.NET测试框架?如果是,哪些说明适合您?
答案 0 :(得分:3)
当我们遇到使用单元测试对我们的应用程序进行故障排除时遇到的问题(我们使用的一些库不喜欢在单元测试环境中运行)我们只需创建一个控制台应用程序,它以与单元测试相同的顺序调用测试方法框架呢。然后,您可以在控制台应用程序上启动探查器。
您可能不需要运行所有测试来找出泄漏的原因。
我们还遇到了非托管内存中的泄漏,这些泄漏在托管内存跟踪工具中并不总是可见。您需要专门查找未管理的内存。这些通常是由于缺少Dispose()调用而导致的。
答案 1 :(得分:0)
你应该试试JetBrains MemoryProfiler(我使用的是3.5版本) 它适用于NUnit(GUI版本)!
答案 2 :(得分:0)
我使用过最新版本的RedGate ANTS(v9.5.0.853),它通过NUnit(v2.6.2)正确(并且轻松)地描述了我的.NET库。
你需要将EXE设置为NUnit exe的启动...并且我针对我的DLL中的特定功能(“Portal.Interface.dll”)。
我创建了新的个人资料会话;
然后我用最高的分析方法运行它。
它产生了我期待的泄漏结果......
答案 3 :(得分:-1)
您确定已经考虑过所有类型的分配,包括非托管内存吗?
顺便说一句,当没有任何内存空闲时,OutOfMemoryException
不一定被抛出。某些类有时会抛出大量连续的内存块,例如StringBuilder
。 XmlDocument.SelectNodes
偶尔抛出它。
不幸的是,你无法做任何事情。如果应用程序繁忙,垃圾收集器有权保持稳定并拒绝释放内存,并且无法找到分配的连续块的可能性会增加。
编辑#1
我可能错误地记错了(责怪啤酒),但你观察到的情况也可以通过垃圾收集器报告它已经发布了对象的事实来解释,但操作系统的内存管理器还没有到处完全释放以前占用的记忆。它比.NET垃圾收集器更有资格做它的感觉。解决此类问题的最佳方法是围绕任何试图分配大量值类型的方法进行设计,最明显的是System.String
。