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.ラージ オブジェクト ヒープにあるMyClass のインスタンスで !ObjSize を実行する方法はありますか?

4

1 に答える 1

6

LOH ですべてのオブジェクトを取得するに!dumpheapは、-minオプションで SOS を使用できます。

!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
于 2015-05-17T15:43:04.663 に答える