Memory 我可以从WinDbg运行.NET垃圾收集吗?

Memory 我可以从WinDbg运行.NET垃圾收集吗?,memory,garbage-collection,clr,windbg,sos,Memory,Garbage Collection,Clr,Windbg,Sos,我正在研究为什么托管进程会占用大量内存。有没有办法从WinDbg运行GC.Collect(3),这样我就可以专注于实际的内存分配?我认为没有办法从WinDbg运行.NET垃圾收集,但我也认为没有必要 有关查找堆中的内容的信息,请参阅 其他可能有用的链接: 我不相信您可以从WinDbg触发GC 以下是我用来跟踪内存分配的一些有用工具: --进一步延长 WinDbg补充SOS,其中 加上!dumpgen可从中转储对象 特定的一代(非常适合 弄清楚陆上有什么,然后 在第2代)和!refs命令

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

我认为没有办法从WinDbg运行.NET垃圾收集,但我也认为没有必要

有关查找堆中的内容的信息,请参阅

其他可能有用的链接:


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

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

  • --进一步延长 WinDbg补充SOS,其中 加上!dumpgen可从中转储对象 特定的一代(非常适合 弄清楚陆上有什么,然后 在第2代)和!refs命令 这将为其提供父引用 物体
  • “这是一个非常重要的问题 运行时的有用工具 以交互方式,但它也包含 从转储文件加载的选项。 这给出了一个相当直观的结果 跟踪内存使用情况的方法。很容易就值250美元的价格,但他们也有14天的评估

    • WinDBG首先是一个Win32/内核调试器。因此,您可能需要尝试一个托管调试器,如。但我过去常常为MSFT提供.NET调试支持,我从来都不需要类似的东西来解决内存泄漏问题

      嘿,罗杰,希望你的内存泄漏现在已经解决了。:-) 我首先要确定这是“托管内存泄漏”。我的意思是,当您查看性能监视器计数器时,所有堆中的.NET CLR内存->#字节的增长速度与同一进程的进程->私有字节计数器的增长速度相同。如果是,则可以使用上述技术。 如果不是,则可能存在本机泄漏,这是运行托管代码的结果。我所看到的最常见的是与在进程中加载而不是卸载的.NET程序集有关。这看起来像Perfmon中的本机内存泄漏。 我建议您尝试在中运行泄漏规则,并查看内存报告中显示的泄漏调用堆栈

      以下是关于该主题的另一个重要资源:

      谢谢,
      亚伦

      我很感兴趣。你能解释一下为什么你认为没有必要吗?没有必要,因为Rico Mariani关于跟踪托管内存泄漏的信息描述了一个过程,可以在不必强制GC的情况下确定应用程序中任何时候可能泄漏的内容或堆上的内容。在步骤7中,你不会经常遇到问题吗(里科·马里亚尼的博客文章)如果你周围有很多对象可能是GC的?这似乎是一个常见的挫折!gcroot对象一个接一个对象,根本找不到引用链。@IV我同意-这是一个真正的痛苦。我经常使用“disposed”标志作为此信息的代理,但不是所有类都实现IDisposeable或在其实现中使用此标志。用于考试示例:.foreach(obj{!dumpheap-type Oracle.DataAccess.Client.OracleConnection-short}){.printf“\n\n”;.printf“Object at:%p\nDisposed:%d”、${obj}、poi(${obj}+12a)&0x00FF;}已解决。我使用其他答案中的技术来找出“泄漏”的内容。这是一堆PaintEventArgs对象或其他东西。原因是:一个每秒重画10次的动画进度条。因此,这实际上不是一个泄漏,只是一个使用了太多内存的控件。首先,也是最重要的是一个Win32/内核调试器。当然,“我从来都不需要类似的东西来解决内存泄漏问题”,那么您使用了什么?