Debugging 如何在CLR/.Net中记录所有垃圾收集事件?

Debugging 如何在CLR/.Net中记录所有垃圾收集事件?,debugging,garbage-collection,clr,Debugging,Garbage Collection,Clr,我正在寻找一个等价的java-verbose:gc或任何工具或代码片段来获得相同的信息。理想情况下,我可以在服务上以无人值守的方式运行它,并将所有内容记录到文件中。我的用例是在长时间运行的服务中分析GC引起的延迟。对于非侵入性的.NET GC分析,您几乎没有选择。您可以使用或或某些探查器(SciTech memory profiler有一个很好的命令行工具,允许您在生产环境中收集CLR分析数据-其他.NET配置文件可能也会公开这样的功能) 我认为性能计数器是入侵性最小的方法,但它们并没有向您提供

我正在寻找一个等价的
java-verbose:gc
或任何工具或代码片段来获得相同的信息。理想情况下,我可以在服务上以无人值守的方式运行它,并将所有内容记录到文件中。我的用例是在长时间运行的服务中分析GC引起的延迟。

对于非侵入性的.NET GC分析,您几乎没有选择。您可以使用或或某些探查器(SciTech memory profiler有一个很好的命令行工具,允许您在生产环境中收集CLR分析数据-其他.NET配置文件可能也会公开这样的功能)

我认为性能计数器是入侵性最小的方法,但它们并没有向您提供有关GC工作的详细信息-尽管您可以看到执行了多少次收集(在每一代中)以及您的进程在GC中花费了多少时间。要收集这些信息,您可以使用perfmon、typeperf或Powershell(我曾经描述过使用perf计数器的不同方法,因此您可以看看:)

ETW事件提供了更多关于GC内部工作的详细信息。您可以手动配置ETW提供程序(例如使用logman或xperf)或使用优秀的工具(如@Marc在注释中指出的)。如果您只对GC事件感兴趣,请选中收集窗口中的
gconly
复选框:

有一个专门用于CLR GC评测的碎片整理工具的精彩片段(第4部分):,我还建议您检查其他部分以及阅读PerfView文档。PerfView是一个非常强大的工具,它甚至允许您分析.NET堆和比较内存快照


最后一个选项(即使用内存分析器)可能是三种方法中最具侵入性的,但有时可能会提供有关GC堆的更多详细信息(特别是当您想要分析对象图时)。我想不出任何好的免费GC内存分析器,所以您可能需要付费才能获得其中一个工具。我有一些使用SciTech Memory Profiler的经验(它非常好,正如我前面提到的,它们可以让您在生产过程中收集数据)。我还尝试了Visual Studio内存配置文件-它不坏,但比SciTech内存配置文件功能弱-最后JetBrains和RedGate还销售内存配置文件,这在.NET开发人员中很有名,可能与SciTech相当

来自Microsoft的PerfView可能会提供此信息。我对Windows开发非常陌生,因此这是非常有用的信息!