垃圾回收 ETW 事件
这些事件可收集有关垃圾回收的信息。 它们可帮助进行诊断和调试,包括确定垃圾回收执行的次数、垃圾回收期间释放的内存量等。
此类别包含以下事件:
- GCStart_V1 事件
- GCEnd_V1 事件
- GCHeapStats_V1 事件
- GCHeapStats_V2 事件
- GCCreateSegment_V1 事件
- GCFreeSegment_V1 事件
- GCRestartEEBegin_V1 事件
- GCRestartEEEnd_V1 事件
- GCSuspendEE_V1 事件
- GCSuspendEEEnd_V1 事件
- GCAllocationTick_V2 事件
- GCAllocationTick_V3 事件
- GCFinalizersBegin_V1 事件
- GCFinalizersEnd_V1 事件
- GCCreateConcurrentThread_V1 事件
- GCTerminateConcurrentThread_V1 事件
GCStart_V1 事件
下表显示了关键字和级别。 有关详细信息,请参阅 CLR ETW 关键字和级别。
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCStart_V1 |
1 | 垃圾回收已启动。 |
下表显示了事件数据:
字段名 | 数据类型 | 说明 |
---|---|---|
计数 | win:UInt32 | 第 n代垃圾回收。 |
深度 | win:UInt32 | 正在回收的代。 |
原因 | win:UInt32 | 垃圾回收的触发原因: 0x0 - 小型对象堆分配。 0x1 - 已引发。 0x2 - 内存不足。 0x3 - 空。 0x4 - 大型对象堆分配。 0x5 - 空间不足(针对小型对象堆)。 0x6 - 空间不足(针对大型对象堆)。 0x7 - 已引发,但未强制为阻止。 0x8 - 压力测试。 0x9 - 终结器线程观察到进程内存不足,并引发 GC。 0x10 - 用户代码引发了 GC,并要求它是压缩 GC。 |
类型 | win:UInt32 | 0x0 - 在后台垃圾回收外部发生了垃圾回收阻止。 0x1 - 后台垃圾回收。 0x0 - 后台垃圾回收期间发生了垃圾回收阻止。 |
ClrInstanceID | win:UInt16 | CLR 或 CoreCLR 的实例的唯一 ID。 |
GCEnd_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCEnd_V1 |
2 | 垃圾回收已结束。 |
下表显示了事件数据:
字段名 | 数据类型 | 说明 |
---|---|---|
计数 | win:UInt32 | 第 n代垃圾回收。 |
深度 | win:UInt32 | 已回收的代。 |
ClrInstanceID | win:UInt16 | CLR 或 CoreCLR 的实例的唯一 ID。 |
GCHeapStats_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 说明 |
---|---|---|
GCHeapStats_V1 |
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 | CLR 或 CoreCLR 的实例的唯一 ID。 |
GCHeapStats_V2 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
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 | CLR 或 CoreCLR 的实例的唯一 ID。 |
GenerationSize4 | win:UInt64 | 已固定对象堆的大小(以字节为单位)。 |
TotalPromotedSize4 | win:UInt64 | 上次回收后仍存在于固定对象堆中的字节数。 |
GCCreateSegment_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCCreateSegment_V1 |
5 | 已创建的新的垃圾回收段。 此外,当在已运行的进程中启用跟踪时,将为每个现有段引发此事件。 |
下表显示了事件数据:
字段名 | 数据类型 | 说明 |
---|---|---|
地址 | win:UInt64 | 段的地址。 |
大小 | win:UInt64 | 段的大小。 |
类型 | win:UInt32 | 0x0 - 小型对象堆。 0x0 - 大型对象堆。 0x2 - 只读堆。 |
ClrInstanceID | win:UInt16 | CLR 或 CoreCLR 的实例的唯一 ID。 |
请注意,由垃圾回收器分配的段的大小特定于实现,且随时可能更改(包括定期更新)。 应用程序不应假设特定段的大小或依赖于此大小,也不应尝试配置段分配可用的内存量。
GCFreeSegment_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCFreeSegment_V1 |
6 | 已释放垃圾回收段。 |
下表显示了事件数据:
字段名 | 数据类型 | 说明 |
---|---|---|
地址 | win:UInt64 | 段的地址。 |
ClrInstanceID | win:UInt16 | CLR 或 CoreCLR 的实例的唯一 ID。 |
GCRestartEEBegin_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCRestartEEBegin_V1 |
7 | 已开始从公共语言运行时挂起进行恢复。 |
无事件数据。
GCRestartEEEnd_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCRestartEEEnd_V1 |
3 | 从公共语言运行时挂起进行的恢复已结束。 |
无事件数据。
GCSuspendEE_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCSuspendEE_V1 |
9 | 开始挂起垃圾回收的执行引擎。 |
下表显示了事件数据:
字段名 | 数据类型 | 说明 |
---|---|---|
原因 | win:UInt16 | 0x0 - 其他。 0x1 - 垃圾回收。 0x2 - 应用程序域关闭。 0x3 - 代码间距调整。 0x4 - 关闭。 0x5 - 调试器。 0x6 - 准备垃圾回收。 |
计数 | win:UInt32 | 此时的 GC 计数。 通常情况下,会在这之后看到后续 GC 开始事件,且在垃圾回收期间增加 GC 索引时,其计数会增加 1。 |
ClrInstanceID | win:UInt16 | CLR 或 CoreCLR 的实例的唯一 ID。 |
GCSuspendEEEnd_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCSuspendEEEnd_V1 |
8 | 结束垃圾回收执行引擎的挂起。 |
无事件数据。
GCAllocationTick_V2 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCAllocationTick_V2 |
10 | 每次为每个对象堆分配大约 100 知识库(KB)。 也就是说,SOH、LOH 和 POH 分别累积其已分配的字节。 在服务器 GC 中,这是按堆完成的。 |
下表显示了事件数据:
字段名 | 数据类型 | 说明 |
---|---|---|
AllocationAmount | win:UInt32 | 分配大小(以字节为单位)。 对于小于 ULONG(4,294,967,295 字节)长度的分配,此值为精确值。 如果分配长度更大,则此字段包含了截断的值。 对于非常大的分配使用 AllocationAmount64 。 |
AllocationKind | win:UInt32 | 0x0 - 小型对象分配(小型对象堆中的分配)。 0x0 - 大型对象分配(大型对象堆中的分配)。 0x2 - 固定对象分配(分配位于固定对象堆中)。 |
ClrInstanceID | win:UInt16 | CLR 或 CoreCLR 的实例的唯一 ID。 |
AllocationAmount64 | win:UInt64 | 分配大小(以字节为单位)。 对于非常大的分配,此值为精确值。 |
TypeId | win:Pointer | MethodTable 的地址。 如果在此事件期间分配了几种类型的对象,则此地址为对应于分配的最后一个对象(导致超过 100 KB 阙值的对象)的 MethodTable 地址。 |
TypeName | win:UnicodeString | 已分配的类型的名称。 如果在此事件期间分配了几种类型的对象,则此地址为对应于分配的最后一个类型(导致超过 100 KB 阙值的对象)。 |
HeapIndex | win:UInt32 | 此对象所分配到的堆。 与工作站垃圾回收一起运行时,此值为 0(零)。 |
GCAllocationTick_V3 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCAllocationTick_V2 |
10 | 每次为每个对象堆分配大约 100 知识库(KB)。 也就是说,SOH、LOH 和 POH 分别累积其已分配的字节。 在服务器 GC 中,这是按堆完成的。 |
下表显示了事件数据:
字段名 | 数据类型 | 说明 |
---|---|---|
AllocationAmount | win:UInt32 | 分配大小(以字节为单位)。 对于小于 ULONG(4,294,967,295 字节)长度的分配,此值为精确值。 如果分配长度更大,则此字段包含了截断的值。 对于非常大的分配使用 AllocationAmount64 。 |
AllocationKind | win:UInt32 | 0x0 - 小型对象分配(小型对象堆中的分配)。 0x0 - 大型对象分配(大型对象堆中的分配)。 0x2 - 固定对象分配(分配位于固定对象堆中)。 |
ClrInstanceID | win:UInt16 | CLR 或 CoreCLR 的实例的唯一 ID。 |
AllocationAmount64 | win:UInt64 | 分配大小(以字节为单位)。 对于非常大的分配,此值为精确值。 |
TypeId | win:Pointer | MethodTable 的地址。 如果在此事件期间分配了几种类型的对象,则此地址为对应于分配的最后一个对象(导致超过 100 KB 阙值的对象)的 MethodTable 地址。 |
TypeName | win:UnicodeString | 已分配的类型的名称。 如果在此事件期间分配了几种类型的对象,则此地址为对应于分配的最后一个类型(导致超过 100 KB 阙值的对象)。 |
HeapIndex | win:UInt32 | 此对象所分配到的堆。 与工作站垃圾回收一起运行时,此值为 0(零)。 |
地址 | win:Pointer | 上次分配的对象的地址。 |
GCFinalizersBegin_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCFinalizersBegin_V1 |
14 | 开始运行终结器。 |
无事件数据。
GCFinalizersEnd_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCFinalizersEnd_V1 |
13 | 结束运行终结器。 |
下表显示了事件数据:
字段名 | 数据类型 | 说明 |
---|---|---|
计数 | win:UInt32 | 运行的终结器数。 |
ClrInstanceID | win:UInt16 | CLR 或 CoreCLR 的实例的唯一 ID。 |
GCCreateConcurrentThread_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
ThreadingKeyword (0x10000) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCCreateConcurrentThread_V1 |
11 | 已创建并发垃圾回收线程。 |
无事件数据。
GCTerminateConcurrentThread_V1 事件
下表显示了关键字和级别:
引发事件的关键字 | Level |
---|---|
GCKeyword (0x1) |
信息性 (4) |
ThreadingKeyword (0x10000) |
信息性 (4) |
下表显示了事件信息:
事件 | 事件 ID | 在发生以下情况时引发 |
---|---|---|
GCTerminateConcurrentThread_V1 |
12 | 已终止并发垃圾回收线程。 |
无事件数据。