假设我有一个用 C# 编写的 WinForms .NET 应用程序。此应用程序从托管堆和非托管堆中分配大量内存。使用Red Gate ANTS Profiler(我没有使用过)或JetBrains dotTrace等工具,我可以(相对)轻松地找出托管对象的分配细节(谁、何时、多少等)。
当托管对象使用大量本机资源(例如图像或大型 COM 对象)时,或者当我调用具有大量内存需求的非托管第三方库时,我遇到了麻烦。到目前为止,我真的需要做一些侦探工作来弄清楚 1) 是托管代码还是非托管代码是内存占用者,以及 2) 谁使用了这么多非托管堆。
我目前唯一的技术是在 perfmon 中设置性能计数器,比较托管堆和非托管堆的大小、分配等。如果托管堆稳定时非托管堆继续增长,我知道要开始查看非托管库和/或消耗本机资源的 .NET 对象。
帮助开发人员处理大量托管和非托管代码的最佳工具和技术组合是什么?
更新:为了更清楚,我想知道如何检测从托管代码调用的非托管代码中的内存问题(高使用率、泄漏)。我相信像 dotTrace 这样的产品只跟踪托管对象。