获取 LOH 中的对象实例列表
Get list of object instances that are in LOH
我在托管堆中有数百个 MyClass 实例。其中一些位于大对象堆中。下面是各种堆结构的样子
0:000> !EEHeap -gc
Number of GC Heaps: 1
generation 0 starts at 0x0000000002df9de8
generation 1 starts at 0x0000000002dc6710
generation 2 starts at 0x0000000002a01000
ephemeral segment allocation context: none
segment begin allocated size
0000000002a00000 0000000002a01000 0000000002e3c2c0 0x43b2c0(4436672)
Large object heap starts at 0x0000000012a01000
segment begin allocated size
0000000012a00000 0000000012a01000 000000001a5ed558 0x7bec558(129942872)
000000002a980000 000000002a981000 00000000328110b8 0x7e900b8(132710584)
0000000033e00000 0000000033e01000 000000003bd80d78 0x7f7fd78(133692792)
000000001daf0000 000000001daf1000 0000000025996188 0x7ea5188(132796808)
00000000542b0000 00000000542b1000 000000005a4bf100 0x620e100(102818048)
000000005c2b0000 000000005c2b1000 000000006344df88 0x719cf88(119132040)
000000007fff0000 000000007fff1000 00000000878bfbc0 0x78cebc0(126675904)
Total Size: Size: 0x34956418 (882205720) bytes.
------------------------------
GC Heap Size: Size: 0x34956418 (882205720) bytes.
我的问题是
1. 如何找到大对象堆中 MyClass 的所有实例的地址。
2. 大对象堆中的 MyClass 实例是否有 运行 !ObjSize?
要获取 LOH 上的所有对象,您可以使用带有 -min
选项的 SOS !dumpheap
。
!dumpheap -min 85001
要将输出限制为您要查找的对象类型,请首先通过
确定对象的方法 table (MT)
!dumpheap -type <MyClass>
Address MT Size
03653250 785037b8 10485776
...
由于 !dumpheap
将在 classes 中查找子字符串,这对于真正将输出减少到 class 的类型是必需的。然后将 -mt
用于您找到的方法 table:
!dumpheap -min 85001 -mt <MethodTable>
为了最小化仅对地址的输出,添加 -short
参数,所以你得到
!dumpheap -min 85001 -mt <MethodTable> -short
然后您可以在 foreach 循环中使用这些地址
.foreach (address {!dumpheap -min 85001 -mt <MethodTable> -short}) {!do ${address}}
由于在对象很多的情况下输出可能会很大,请考虑将所有内容记录到一个文件中
.logopen c:\debug\logs\largeobjects.txt
我在托管堆中有数百个 MyClass 实例。其中一些位于大对象堆中。下面是各种堆结构的样子
0:000> !EEHeap -gc
Number of GC Heaps: 1
generation 0 starts at 0x0000000002df9de8
generation 1 starts at 0x0000000002dc6710
generation 2 starts at 0x0000000002a01000
ephemeral segment allocation context: none
segment begin allocated size
0000000002a00000 0000000002a01000 0000000002e3c2c0 0x43b2c0(4436672)
Large object heap starts at 0x0000000012a01000
segment begin allocated size
0000000012a00000 0000000012a01000 000000001a5ed558 0x7bec558(129942872)
000000002a980000 000000002a981000 00000000328110b8 0x7e900b8(132710584)
0000000033e00000 0000000033e01000 000000003bd80d78 0x7f7fd78(133692792)
000000001daf0000 000000001daf1000 0000000025996188 0x7ea5188(132796808)
00000000542b0000 00000000542b1000 000000005a4bf100 0x620e100(102818048)
000000005c2b0000 000000005c2b1000 000000006344df88 0x719cf88(119132040)
000000007fff0000 000000007fff1000 00000000878bfbc0 0x78cebc0(126675904)
Total Size: Size: 0x34956418 (882205720) bytes.
------------------------------
GC Heap Size: Size: 0x34956418 (882205720) bytes.
我的问题是
1. 如何找到大对象堆中 MyClass 的所有实例的地址。
2. 大对象堆中的 MyClass 实例是否有 运行 !ObjSize?
要获取 LOH 上的所有对象,您可以使用带有 -min
选项的 SOS !dumpheap
。
!dumpheap -min 85001
要将输出限制为您要查找的对象类型,请首先通过
确定对象的方法 table (MT)!dumpheap -type <MyClass>
Address MT Size
03653250 785037b8 10485776
...
由于 !dumpheap
将在 classes 中查找子字符串,这对于真正将输出减少到 class 的类型是必需的。然后将 -mt
用于您找到的方法 table:
!dumpheap -min 85001 -mt <MethodTable>
为了最小化仅对地址的输出,添加 -short
参数,所以你得到
!dumpheap -min 85001 -mt <MethodTable> -short
然后您可以在 foreach 循环中使用这些地址
.foreach (address {!dumpheap -min 85001 -mt <MethodTable> -short}) {!do ${address}}
由于在对象很多的情况下输出可能会很大,请考虑将所有内容记录到一个文件中
.logopen c:\debug\logs\largeobjects.txt