Windbg 中使用 !eeheap -gc

时间:2024-07-05 13:59:59

在 Windbg 中使用 !eeheap -gc 命令时,输出结果中的 "GC Heap Size" 表示垃圾回收堆的大小。具体来说,这是指在托管堆上分配给不同代(Generation)的对象的内存总量。托管堆是 .NET 运行时用来存储托管对象的内存区域,由垃圾回收器(GC)管理。

代(Generation)

托管堆通常分为以下几代:

  1. Gen 0(第0代):存放新分配的对象,GC 回收最频繁。此代的对象生命周期通常较短。
  2. Gen 1(第1代):存放从 Gen 0 提升的对象,这些对象已经幸存了一次 GC 回收。
  3. Gen 2(第2代):存放从 Gen 1 提升的对象,这些对象的生命周期较长,GC 回收频率较低。
  4. LOH(Large Object Heap,大对象堆):存放大对象(通常大于 85,000 字节),这些对象不参与代的分类。

!eeheap -gc 输出示例

当你运行 !eeheap -gc 命令时,会得到类似以下的输出:

Number of GC Heaps: 1
generation 0 starts at 0x00000000e1f54008
generation 1 starts at 0x00000000e1f43020
generation 2 starts at 0x00000000e1e22028
ephemeral segment allocation context: none
 segment     begin allocated  size
0xe1e20000 0x00000000e1e22000  0x00000000e1f63000  0x0000000000143000(1,290,240)
Large object heap starts at 0x00000000f1e20000
 segment     begin allocated  size
0xf1e20000 0x00000000f1e22000  0x00000000f1e63000  0x0000000000043000(274,432)
Total Size:              Size:  0x0000000000186000 (1,564,672) bytes.
------------------------------
GC Heap Size:            Size:  0x0000000000186000 (1,564,672) bytes.

解释

  • generation 0/1/2 starts at:显示每代在堆中的起始地址。
  • ephemeral segment allocation context:表示临时段分配上下文。
  • segment begin allocated size:显示各段的起始地址、已分配地址和大小。
  • Large object heap starts at:表示大对象堆的起始地址及分配情况。
  • Total Size:整个 GC 堆的总大小。
  • GC Heap Size:这是总的 GC 堆大小,即所有代(Gen 0、Gen 1、Gen 2)和大对象堆的总和。

总结

"GC Heap Size" 是 GC 管理的托管堆的总内存大小,包含了所有代和大对象堆。通过分析 !eeheap -gc 的输出,你可以了解 GC 堆的分布和内存使用情况,有助于识别和解决内存管理问题。