能否在WinDbg中通过崩溃转储获取GC性能计数器?
结论
你提到的大部分GC性能计数器都可以通过WinDbg或其他调试工具从崩溃转储中读取,仅allocated bytes / sec 无法从单份转储中直接获取,该指标属于速率类统计,需要时间维度的采样数据支撑计算,而崩溃转储只是进程运行的瞬时快照。
WinDbg查询步骤
首先需要加载与转储对应的.NET版本SOS扩展(注意扩展架构需要和转储进程的32/64位架构匹配),加载完成后通过以下命令获取对应指标:
- 分代GC回收次数(
# Gen 0 Collections、# Gen 1 Collections、# Gen 2 Collections):执行!eeversion命令,输出结果会直接展示三类分代回收的累计次数,也可以通过!gcinfo -gen查看更详细的分代回收细节 - 诱导GC次数(
# Induced GC):执行!gcheapstats命令,输出的GC全局统计字段中会直接展示显式调用GC.Collect触发的回收次数 - GC时间占比(
% Time in GC):同样通过!gcheapstats命令获取,结果中的GC time percentage字段就是进程启动到转储生成时刻的累计GC时间占比,注意这个是累计值,和Performance Monitor的实时采样瞬时值可能存在差异
其他工具方案
如果不熟悉WinDbg命令,也可以用Visual Studio打开崩溃转储,选择「调试托管内存」功能,生成的内存分析报告的「GC统计」面板会直接展示上述除分配速率之外的所有指标,操作门槛更低。
关于分配速率指标说明
allocated bytes / sec是单位时间内的托管堆分配速率,单份崩溃转储仅保留快照时刻的内存状态,没有时间窗口的分配总量记录,无法直接计算。如果存在同一进程前后两个时间点的转储,可以通过两份转储的托管堆总分配量差值除以时间差估算该指标的平均水平。
内容的提问来源于stack exchange,提问作者codefast
相关产品推荐
相关产品推荐

