我正在寻找等效的java -verbose:gc
或任何工具或代码片段来获取相同的信息。理想情况下,这将是我可以在服务上以无人值守的方式运行并将所有内容记录到文件中的东西。我的用例是在长期运行的服务中分析 GC 引起的延迟。
1 回答
对于非侵入性 .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
选中收集窗口中的复选框:
有一个很棒的片段碎片整理工具专门用于 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 的经验(它非常好,而且正如我之前提到的,他们有一个命令行客户端,可以让您收集生产数据)。我还尝试了 Visual Studio 内存配置文件——它还不错,但不如 SciTech 的强大——最后 JetBrains 和 RedGate 还出售内存分析器,它们在 .NET 开发人员中很知名,可能与 SciTech 相当。