DA0023:垃圾回收占用的 CPU 时间很多

规则 ID

DA0023

类别

.NET Framework 使用

分析方法

全部

消息

% Time in GC 相当高。 这表示垃圾回收开销过多,可能会影响应用程序的响应。 可以收集 .NET 内存分配数据和对象生存期信息,以更好地了解应用程序使用的内存分配模式。

规则类型

信息性

在使用采样、.NET 内存或资源争用方法进行分析时,必须收集至少 10 个样本才能触发此规则。

原因

分析期间收集的系统性能数据表明,与应用程序总处理时间相比,垃圾回收所用时间很长。

规则说明

Microsoft .NET 公共语言运行时 (CLR) 提供了自动内存管理机制,该系统使用垃圾回收器从应用程序不再使用的对象回收内存。 垃圾回收器是面向代的,并假定许多分配的生存期都较短。 例如,本地变量的生存期应比较短。 新创建的对象从第 0 代 (gen 0) 开始,然后如果这些对象在运行垃圾回收后仍然存在,则它们进入第 1 代,最后如果应用程序仍然使用这些对象,则它们最终进入第 2 代。

第 0 代的对象常被收集而且通常收集效率非常高。 第 1 代的对象收集得较少而且收集效率较低。 最后,应更少地收集第 2 代生存期长的对象。 第 2 代回收运行的是完整垃圾回收,也是最消耗资源的操作。

与应用程序总处理时间相比,如果垃圾回收所用时间特别长,则会激发此规则。

提示

与应用程序总处理时间相比,如果垃圾回收所花费的那部分时间过长,则会激发 DA0024:垃圾回收占用的 CPU 时间过多警告,而不是激发此规则。

如何调查警告

双击“错误列表”窗口中的该消息以导航到分析数据的“标记”视图。 查找**“.NET CLR Memory\% Time in GC”列。 确定程序执行过程中是否有一些特定阶段的托管内存垃圾回收开销多于其他阶段。 将 % Time in GC 的值与“# of Gen 0 Collections”“# of Gen 1 Collections”“# of Gen 2 Collections”**值中所报告的垃圾回收的比率相比较。

% Time in GC 值尝试报告应用程序执行垃圾回收所花费的时间占总处理时间的比例。 请注意,在有些情况下,% Time in GC 值可能报告非常高的值,但其原因并不是因为垃圾回收过多。 有关 % Time in GC 值的计算方法的更多信息,请参见 MSDN 上 Maoni's Weblog中的 Difference Between Perf Data Reported by Different Tools – 4(不同工具所报告的性能数据间的差异 – 4)条目。 如果页面出错或者在垃圾回收期间应用程序被计算机上其他高优先级的工作所抢占,则 % Time in GC 计数器将反映这些额外的延迟。