获取在 LOH 中的对象实例列表

5

我在托管堆中有好几百个 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. 是否有办法在大对象堆中运行!ObjSize以查看这些MyClass实例的大小?


使用Google搜索类似这样的问题,查询“sos dump loh”。第一个结果会向您展示如何使用!DumpHeap - Hans Passant
@HansPassant 谢谢,我刚刚找到了这个链接http://blogs.msdn.com/b/tess/archive/2005/11/25/496973.aspx,回答了我的问题#1。我也会尝试你的建议。 - paul deter
1个回答

6
要获取LOH上的所有对象,可以使用SOS命令!dumpheap-min选项。
!dumpheap -min 85001

为了将输出限制在您正在查找的对象类型上,首先通过执行以下操作来确定对象的方法表(MT):

!dumpheap -type <MyClass>

 Address       MT     Size
03653250 785037b8 10485776
...

由于!dumpheap将在类中查找子字符串,因此需要使用该命令以真正将输出减少到您的类类型。然后使用找到的方法表的-mt

!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

只是想指出大对象堆可能包含小于85,000字节的对象。具体来说,双精度数组从8K左右开始放置在LOH上,如果我没记错的话。 - Sasha Goldshtein
@SashaGoldshtein:我也看过那篇文章,但根据我的实验结果,这并不是真的,或者至少不再是真的了。请参见http://stackoverflow.com/questions/30361184/loh-fragmentation-2015-update - Thomas Weller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接