假设我有一个用C#编写的WinForms .NET应用程序。此应用程序从托管堆和非托管堆分配大量内存。我可以(相对)轻松地使用Red Gate ANTS Profiler(我没有使用过)或JetBrains dotTrace等工具来确定托管对象的分配详细信息(谁,何时,多少等)。
我遇到麻烦的地方是托管对象使用重要的本机资源(例如图像,或大型COM对象),或者当我调用具有大量内存需求的非托管第三方库时。到目前为止,我真的需要做一些侦探工作来弄清楚1)是托管或非托管代码是内存耗尽和2)谁使用了这么多非托管堆。
我目前唯一的技术是在perfmon中设置性能计数器,比较托管堆与非托管堆的大小,分配等。如果非托管堆继续增长而托管堆稳定,我知道要启动查看使用本机资源的非托管库和/或.NET对象。
帮助开发人员管理大量托管和非托管代码的最佳工具和技术组合是什么?
更新:为了更清楚,我想知道如何检测从托管代码调用的非托管代码中的内存问题(高使用率,泄漏)。我相信像dotTrace这样的产品只跟踪托管对象。
答案 0 :(得分:1)
答案 1 :(得分:0)
您只需查看Perfmon中提供的许多.NET内存计数器即可获得概述。
如果您想使用免费工具,Debugging Tools for Windows(特别是WinDbg + SoS)可以告诉您为什么没有按预期收集对象。
答案 2 :(得分:0)
Memory Validator可以告诉您有关.Net应用程序或混合模式.Net应用程序或本机应用程序中的非托管(本机)分配内存的所有信息。