2

假设我有一个用 C# 编写的 WinForms .NET 应用程序。此应用程序从托管堆和非托管堆中分配大量内存。使用Red Gate ANTS Profiler(我没有使用过)或JetBrains dotTrace等工具,我可以(相对)轻松地找出托管对象的分配细节(谁、何时、多少等)。

当托管对象使用大量本机资源(例如图像或大型 COM 对象)时,或者当我调用具有大量内存需求的非托管第三方库时,我遇到了麻烦。到目前为止,我真的需要做一些侦探工作来弄清楚 1) 是托管代码还是非托管代码是内存占用者,以及 2) 谁使用了这么多非托管堆。

我目前唯一的技术是在 perfmon 中设置性能计数器,比较托管堆和非托管堆的大小、分配等。如果托管堆稳定时非托管堆继续增长,我知道要开始查看非托管库和/或消耗本机资源的 .NET 对象。

帮助开发人员处理大量托管非托管代码的最佳工具和技术组合是什么?

更新:为了更清楚,我想知道如何检测从托管代码调用的非托管代码中的内存问题(高使用率、泄漏)。我相信像 dotTrace 这样的产品只跟踪托管对象。

4

3 回答 3

1

您可以使用与 .net 应用程序兼容的许多内存分析工具中的任何一种。一些如下:

1) .NET 探查器 API

2) dotTRACE 分析器

3)内存分析器

于 2009-01-28T15:39:53.327 回答
0

您只需查看 Perfmon 中可用的许多 .NET 内存计数器即可获得概览。

如果您想使用免费工具,Windows 调试工具(特别是 WinDbg + SoS)可以告诉您为什么没有按预期收集对象。

于 2009-01-28T15:45:06.797 回答
0

Memory Validator可以告诉您所有有关 .Net 应用程序或混合模式 .Net 应用程序或本机应用程序中非托管(本机)分配的内存的信息。

于 2010-03-16T19:53:54.467 回答