9
0:000> !dumpheap -stat
total 1755874 objects
Statistics:
MT    Count    TotalSize Class Name
7b9b0c64        1           12 System.Windows.Forms.Layout.TableLayout+ColumnSpanComparer
....
7933303c    14006      4926456 System.Collections.Hashtable+bucket[]
65246e00      804      4982192 System.Data.RBTree`1+Node[[System.Int32, mscorlib]][]
054c55f0    44240      5662720 DevExpress.Utils.AppearanceObject
793040bc    98823      7613156 System.Object[]
793308ec   293700     55820016 System.String
002435f0    50315    138631888      Free
Total 1755874 objects

Fragmented blocks larger than 0.5 MB:
    Addr     Size      Followed by
15a195c8    0.8MB         15ae3950 System.Collections.ArrayList
15d81468    1.6MB         15f23708 System.String
15f23984    1.0MB         16029ae4 System.String
... about 7 more objects here
1ee51764    0.5MB         1eedbaa4 System.WeakReference
1f0df96c    2.4MB         1f34d4b0 System.String
1f3e1ca8    3.7MB         1f79afc4 System.WeakReference

ピン留めと断片化について読んでいます。大量の空き容量を考えると、断片的に見えます。私は今それを追跡する必要があると思います。

考え?フィードバック?

4

1 に答える 1

5

つまり...断片化されたヒープがあることがわかります。次の質問は、断片化の原因は何ですか? これらの無料のオブジェクトが解放されないようにしているのは何ですか? 私が読んだ推奨事項は、空き領域の直後のオブジェクトを調べることです。

  1. !ダンプヒープ -stat

  2. Free オブジェクトのメソッド テーブルをダンプします: !dumpheap -mt 000db8e8

  3. リストから Free オブジェクトを 1 つ選択して、さらに詳しく調べます: !dumpobj 0x2003b0b0

  4. オブジェクトのサイズを記録する

  5. 次のオブジェクトをダンプします: !dumpobj 0x2003b0b0+1000

  6. 参照を保持しているオブジェクトを見つけます !gcroot 0x2003b0b0+1000

  7. 見つかったオブジェクトの gchandle をダンプします。

私は通常、このうさぎの穴に落ち込みますが、.NET API に関する限られた知識はここでは役に立ちません。これは問題をデバッグする正しい方法ですか?

ジェフ

于 2009-05-18T19:37:33.147 に答える