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

时间:2013-06-21 02:27:46

标签: debugging garbage-collection clr

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

1 个答案:

答案 0 :(得分:3)

对于非侵入式.NET GC分析,您几乎没有选择。您可以使用CLR Memory Performance CountersCLR Memory Event Tracing或某些分析器(SciTech内存分析器有一个很好的命令行工具,允许您在生产环境中收集CLR分析数据 - 其他.NET配置文件可能也会暴露这样的特征)。

我认为性能计数器是侵入性最小的方法,但它们并没有为您提供有关GC工作的详细信息 - 尽管您可以看到执行了多少个集合(在每一代中)以及您的流程在GC中花费了多少时间。要收集此信息,您可以使用perfmon,typeperf或Powershell(我曾经描述了使用perf计数器的不同方法,因此您可以查看:http://lowleveldesign.wordpress.com/2012/04/19/diagnosing-applications-using-performance-counters/

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

enter image description here

有一个很棒的Defrag Tools专门用于CLR GC分析(第4部分):http://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-36-CLR-GC-Part-4,我还建议您检查其他部分以及阅读PerfView文档。 PerfView是一个非常强大的工具,它甚至允许您分析.NET堆并比较内存快照。

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