WinDbg を使用して .NET アプリケーションに侵入し、同時に VMMap を実行することはできません。これにより、VMMap がハングアップします。逆方向にも実行できません。最初に VMMap を起動し、次に WinDbg に侵入してから、VMMap の値を更新します。
したがって、VMMap によって表示される値は、異なる時点からの数値であるため、おそらく決して等しくありません。異なる時点は、ガベージ コレクターが実行されたことを意味する場合もあります。アプリケーションがそれほど変化していない場合、値は近いはずです。
私のテストでは、VMMap のマネージド ヒープのコミットされた部分は と の合計で!eeheap -gc
あり!eeheap -loader
、妥当に思えます。
の出力を考えると、!eeheap -gc
世代 2 (11aa0000) で GC ヒープの開始が得られ、サイズはわずか 3.6 MB です。
Number of GC Heaps: 1
generation 0 starts at 0x0000000011d110f8
generation 1 starts at 0x0000000011cd1130
generation 2 starts at 0x0000000011aa1000
...
GC Heap Size 0x374a00(3623424)
!address
詳細を示します。
...
+ 0`11aa0000 0`11ef2000 0`00452000 MEM_PRIVATE MEM_COMMIT PAGE_READWRITE <unknown>
0`11ef2000 0`21aa0000 0`0fbae000 MEM_PRIVATE MEM_RESERVE <unknown>
0`21aa0000 0`21ac2000 0`00022000 MEM_PRIVATE MEM_COMMIT PAGE_READWRITE <unknown>
0`21ac2000 0`29aa0000 0`07fde000 MEM_PRIVATE MEM_RESERVE <unknown>
+ 0`29aa0000 0`6ca20000 0`42f80000 MEM_FREE PAGE_NOACCESS Free
...
文書化されていませんが、新しいセグメントは記号で示されている 11aa0000 から始まると思います+
。GC セグメントは 29aa0000 で終了します。これは、次のセグメントの開始点でもあります。クロス チェック: .NET メモリは<unknown>
、最後の列のように報告される必要があります。
合計 GC サイズ (予約済み + コミット済み) は
?29aa0000-11aa0000
Evaluate expression: 402653184 = 00000000`18000000
これは 402 MB または 393.216 kB で、私の場合は VMMap によって報告された 395.648 kB に非常に近い値です。
より多くの GC ヒープがある場合、プロセス全体でより多くの労力が必要になります。したがって、私は通常、.NET 以外に VirtualAlloc() を呼び出すものがないことがわかっている場合は、ショートカットを使用します。次!address -summary
のように入力して、最初の<unknown>
エントリを確認します。
--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Free 144 7ff`d8a09000 ( 7.999 Tb) 99.99%
<unknown> 180 0`1a718000 ( 423.094 Mb) 67.17% 0.01%
...