.NET 运行时垃圾回收事件

本文中所述的事件收集与垃圾回收相关的信息。 它们有助于诊断和调试,包括确定垃圾回收的执行次数、垃圾回收期间释放的内存量等。有关如何将这些事件用于诊断目的的详细信息,请参阅 日志记录和跟踪 .NET 应用程序

GCStart_V2 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCStart_V1 1 垃圾回收已开始。

下表显示了事件数据:

字段名称 数据类型 描述
Count win:UInt32 垃圾回收 n
Depth win:UInt32 正在收集的代系。
Reason win:UInt32 为何触发垃圾回收:

0x0 - 小型对象堆分配。

0x1 - 诱发。

0x2 - 内存不足。

0x3 - 空。

0x4 - 大型对象堆分配。

0x5 - 空间不足(对于小型对象堆)。

0x6 - 空间不足(对于大型对象堆)。

0x7 - 诱发但不是强制阻止。
Type win:UInt32 0x0 - 阻止垃圾回收发生在后台垃圾回收之外。

0x1 - 后台垃圾回收。

0x2 - 在后台垃圾回收期间发生阻止垃圾回收。
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。

GCEnd_V1 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCEnd_V1 2 垃圾回收已结束。

下表显示了事件数据:

字段名称 数据类型 描述
Count win:UInt32 垃圾回收 n
Depth win:UInt32 收集的代系。
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。

GCHeapStats_V2 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)

下表显示了事件信息:

事件 事件 ID 描述
GCHeapStats_V2 4 显示每个垃圾回收结束时的堆统计信息。

下表显示了事件数据:

字段名称 数据类型 描述
GenerationSize0 win:UInt64 第 0 代内存的大小(以字节为单位)。
TotalPromotedSize0 win:UInt64 从第 0 代升级到第 1 代的字节数。
GenerationSize1 win:UInt64 第 1 代内存的大小(以字节为单位)。
TotalPromotedSize1 win:UInt64 从第 1 代升级到第 2 代的字节数。
GenerationSize2 win:UInt64 第 2 代内存的大小(以字节为单位)。
TotalPromotedSize2 win:UInt64 在最后一个集合之后的第 2 代中幸存的字节数。
GenerationSize3 win:UInt64 大型对象堆的大小(以字节为单位)。
TotalPromotedSize3 win:UInt64 在上一个集合之后的大型对象堆中幸存下来的字节数。
FinalizationPromotedSize win:UInt64 准备好进行最终化的对象的总大小(以字节为单位)。
FinalizationPromotedCount win:UInt64 准备进行最终化的对象数。
PinnedObjectCount win:UInt32 固定的(不可移动)对象的数目。
SinkBlockCount win:UInt32 正在使用的同步块数。
GCHandleCount win:UInt32 正在使用的垃圾回收句柄数。
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。
GenerationSize4 win:UInt64 固定对象堆的大小(以字节为单位)。
TotalPromotedSize4 win:UInt64 在最后一个集合之后固定的对象堆中幸存下来的字节数。

GCCreateSegment_V1 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCCreateSegment_V1 5 已创建新的垃圾回收段。 此外,在正在运行的进程上启用跟踪时,会为每个现有段引发此事件。

下表显示了事件数据:

字段名称 数据类型 描述
Address win:UInt64 段的地址。
Size win:UInt64 段的大小。
Type win:UInt32 0x0 - 小型对象堆。

0x1 - 大型对象堆。

0x2 - 只读堆。
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。

请注意,垃圾回收器分配的段大小特定于实现,随时可能会更改,包括定期更新。 你的应用不应假设或依赖于特定的段大小,也不应尝试配置可用于段分配的内存量。

GCFreeSegment_V1事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCFreeSegment_V1 6 已释放垃圾回收段。

下表显示了事件数据:

字段名称 数据类型 描述
Address win:UInt64 段的地址。
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。

GCRestartEEBegin_V1 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCRestartEEBegin_V1 7 已开始从公共语言运行时挂起恢复。

此事件没有任何事件数据。

GCRestartEEEnd_V1事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCRestartEEEnd_V1 3 公共语言运行时挂起的恢复已结束。

此事件没有任何事件数据。

GCSuspendEEEnd_V1 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCSuspendEEEnd_V1 8 停止执行引擎进行垃圾回收。

此事件没有任何事件数据。

GCSuspendEEBegin_V1事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCSuspendEEBegin_V1 9 开始暂停执行引擎进行垃圾回收。
字段名称 数据类型 描述
Count win:UInt32 垃圾回收 n
Reason win:UInt32 EE 暂停的原因。

0x0:其他暂停

0x1:为 GC 挂起。

0x2:暂停 AppDomain 关闭。

0x3:暂停代码投向。

0x4:暂停关闭。

0x5:调试器挂起。

0x6:为 GC 准备挂起。

0x7:调试器扫描挂起

GCAllocationTick_V3 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 详细 (5)

下表显示了事件信息:

事件 事件 ID
GCAllocationTick_V3 10 每次分配大约 100 KB 时。

下表显示了事件数据:

字段名称 数据类型 描述
AllocationAmount win:UInt32 分配大小(以字节为单位)。 此值对于小于 ULONG 长度(4,294,967,295 字节)的分配是准确的。 如果分配更大,则此字段包含截断的值。 将 AllocationAmount64 用于非常大的分配。
AllocationKind win:UInt32 0x0 - 小型对象分配(分配位于小型对象堆中)。

0x1 - 大型对象分配(分配位于大型对象堆中)。
AllocationAmount64 win:UInt64 分配大小(以字节为单位)。 此值对于非常大的分配是准确的。
TypeId win:Pointer MethodTable 的地址。 如果在此事件期间分配了多种类型的对象,则这是与分配的最后一个对象相对应的 MethodTable 的地址(导致超过 100 KB 阈值的对象)。
TypeName win:UnicodeString 已分配的类型的名称。 如果在此事件期间分配了多种类型的对象,则这是分配的最后一个对象的类型(导致超过 100 KB 阈值的对象)。
HeapIndex win:UInt32 分配对象的堆。 使用工作站垃圾回收运行时,此值为 0(零)。
Address win:Pointer 最后一个已分配对象的地址。
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。

GCCreateConcurrentThread_V1 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)
ThreadingKeyword(0x10000) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCCreateConcurrentThread_V1 11 已创建并发垃圾回收线程。

此事件没有任何事件数据。

GCTerminateConcurrentThread_V1 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)
ThreadingKeyword(0x10000) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCTerminateConcurrentThread_V1 12 并发垃圾回收线程已终止。

此事件没有任何事件数据。

GCFinalizersBegin_V1事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCFinalizersBegin_V1 14 运行终结器的开始。

此事件没有任何事件数据。

GCFinalizersEnd_V1事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
GCFinalizersEnd_V1 13 运行终结器的结束。

下表显示了事件数据:

字段名称 数据类型 描述
Count win:UInt32 运行的终结器数。
ClrInstanceID win:UInt16 CLR 或 CoreCLR 实例的唯一 ID。

SetGCHandle 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCHandleKeyword (0x2) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
SetGCHandle 30 已设置 GC 句柄。

下表显示了事件数据:

字段名称 数据类型 描述
HandleID win:Pointer 已分配句柄的地址。
ObjectID win:Pointer 创建句柄的对象地址。
Kind win:UInt32 已设置的 GC 句柄的类型。

0x0:WeakShort

0x1:WeakLong

0x2: 强

0x3:固定

0x4:变量

0x5:RefCounted

0x6:从属

0x7:AsyncPinned

0x8:SizedRef
Generation win:UInt32 创建其句柄的对象生成。
AppDomainID win:UInt64 AppDomain ID。
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。

DestroyGCHandle 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCHandleKeyword (0x2) 信息性 (4)

下表显示了事件信息:

事件 事件 ID
DestroyGCHandle 31 GC 句柄已销毁。

下表显示了事件数据:

字段名称 数据类型 描述
HandleID win:Pointer 已销毁句柄的地址。
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。

PinObjectAtGCTime 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 详细 (5)

下表显示了事件信息:

事件 事件 ID
PinObjectAtGCTime 33 在 GC 期间固定对象。

下表显示了事件数据:

字段名称 数据类型 描述
HandleID win:Pointer 句柄的地址。
ObjectID win:Pointer 固定对象的地址。
ObjectSize win:UInt64 固定对象的大小。
TypeName win:UnicodeString 固定对象的类型的名称。
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。

GCTriggered 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 详细 (5)

下表显示了事件信息:

事件 事件 ID
GCTriggered 35 已触发 GC。

下表显示了事件数据:

字段名称 数据类型 描述
Reason win:UInt32 触发 GC 的原因。

0x0: AllocSmall

0x1:诱发

0x2:LowMemory

0x3:空

0x4: AllocLarge

0x5:OutOfSpaceSmallObjectHeap

0x6:OutOfSpaceLargeObjectHeap

0x7:InducedNoForce

0x8: 压力

0x9:InducedLowMemory
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。

IncreaseMemoryPressure 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息 (4)

下表显示了事件信息:

事件 事件 ID
IncreaseMemoryPressure 200 内存压力增加。

下表显示了事件数据:

字段名称 数据类型 描述
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。

DecreaseMemoryPressure 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息 (4)

下表显示了事件信息:

事件 事件 ID
DecreaseMemoryPressure 201 内存压力已降低。

下表显示了事件数据:

字段名称 数据类型 描述
BytesFreed win:UInt32 释放的字节数。
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。

GCMarkWithType 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 信息 (4)

下表显示了事件信息:

事件 事件 ID
GCMarkWithType 202 GC 根已在 GC 标记阶段进行标记。

下表显示了事件数据:

字段名称 数据类型 描述
HeapNum win:UInt32 堆号。
ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。
Type win:UInt32 GC 根类型。

0x0: Stack

0x1:终结器

0x2:句柄

0x3:较旧

0x4:SizedRef

0x5: Overflow

Bytes win:UInt64 标记的字节数。

GCJoin_V2 事件

下表显示了关键字和级别:

引发事件的关键字 水平
GCKeyword (0x1) 详细 (5)

下表显示了事件信息:

事件 事件 ID
GCJoin_V2 203 已联接 GC 线程。

下表显示了事件数据:

字段名称 数据类型 描述
Heap win:UInt32 堆号
JoinTime win:UInt32 指示此事件是在联接的开头还是联接的末尾触发(0x0 用于联接开始,0x1 联接结束)
JoinType win:UInt32 联接类型。

0x0:上次加入

0x1:联接

0x2:重启

0x3:第一个反向联接

0x4:反向联接

ClrInstanceID win:UInt16 CoreCLR 实例的唯一 ID。