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

Ram*_*mon 3 debugging clr garbage-collection

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

low*_*ign 5

对于非侵入式.NET GC分析,您几乎没有选择。您可以使用CLR内存性能计数器CLR内存事件跟踪,也可以使用某些事件探查器(SciTech 内存事件探查器具有一个不错的命令行工具,可让您在生产环境中收集CLR分析数据-其他.NET概要文件也可能提供了此功能) 。

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

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

在此处输入图片说明

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

最后一个选项(使用memory profiler)可能是这三种方法中最具侵入性的,但是有时可能会为您提供有关GC堆的更多详细信息(尤其是当您要分析对象图时)。我想不出有什么好的免费的GC Memory Profiler,所以您可能需要付费才能获得这些工具之一。我对SciTech Memory Profiler有一定的经验(这非常好,并且正如我之前提到的,他们有一个命令行客户端,可让您收集生产数据)。我还尝试了Visual Studio内存配置文件-不错,但功能不如SciTech强大-最后,JetBrains和RedGate也出售.NET开发人员中众所周知的内存配置文件,可能与SciTech相当。