17

我正在研究为什么托管进程使用大量内存。有没有办法GC.Collect(3)从 WinDbg 运行,以便我可以专注于实际的内存分配?

4

4 回答 4

5

我认为没有任何方法可以从 WinDbg 运行 .NET 垃圾收集,但我也不认为有必要。

请参阅Rico Mariani 的 Performance Tidbits - Tracking down managed memory leaks (how to find a GC leak),了解有关找出堆上的内容的信息。

其他可能有用的链接:

于 2008-12-02T16:17:29.067 回答
3

我不相信您可以从 WinDbg 触发 GC。

以下是一些我用来进行内存分配跟踪的有用工具:

  • SOSEX - WinDbg 的进一步扩展以补充 SOS,它添加了 !dumpgen 以转储来自特定世代的对象(非常适合找出 LOH 和 Gen 2 中的内容)和 !refs 命令,它将为父级引用提供目的。
  • .Net Memory Profiler——这是一个交互式运行时非常有用的工具,但它还包含一个从转储文件加载的选项。这提供了一种相当直观的方式来跟踪内存使用情况。轻松值得 250 美元的价格,但他们也有 14 天的评估。
于 2008-12-02T16:35:26.283 回答
2

WinDBG 首先是一个 Win32/内核调试器。因此,您可能想尝试其中一种托管调试器,例如mDBG。但我曾经为 MSFT 提供 .NET 调试支持,而且我从来不需要这样的东西来解决内存泄漏问题。

于 2008-12-02T16:46:36.637 回答
0

嘿,罗杰,希望您的内存泄漏现在得到解决。:-)

我首先要确定它是“托管内存泄漏”。我的意思是,当您查看性能监视器计数器时,.NET CLR Memory -> # Bytes in all heaps以与同一进程的Process -> Private Bytes计数器相同的速率增加。如果是,那么您可以使用上述技术。

如果不是,您可能会因为运行托管代码而出现本机泄漏。我看到的最常见的情况与在进程中加载​​而不是卸载的 .NET 程序集有关。这看起来像是 Perfmon 中的本机内存泄漏。

我建议您尝试在DebugDiag中运行泄漏规则并查看内存报告显示为泄漏调用堆栈的内容。

Here is another great resource on the subject: I have a memory leak!!! What do i do? (defining the "where")

Thanks, Aaron

于 2009-02-21T22:05:59.627 回答