代码之家  ›  专栏  ›  技术社区  ›  Keith

我的堆碎了吗?

  •  9
  • Keith  · 技术社区  · 16 年前
    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
    

    我一直在读关于钉住和分裂的书。它看起来支离破碎,给了我大量的自由空间。我想我现在必须找到它。

    思想?反馈?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Benoit Sanchez    6 年前

    所以…我们知道我们有一个碎片堆。下一个问题是:是什么导致了碎片化?是什么阻止这些自由物体被释放?我读过的建议是在自由空间之后检查物体:

    1. !哑铃

    2. 转储自由对象的方法表:!转储堆-mt 000db8e8

    3. 从列表中选择一个要仔细检查的自由对象:!转储对象0X2003B0B0

    4. 记录对象的大小

    5. 在它后面转储下一个对象:!dumpobj 0x2003b0b0+1000型

    6. 找到有参考物的物体!GCROOT 0x2003b0b0+1000型

    7. 转储找到的对象的gcHandle。

    我通常从这个兔子洞里钻出来,我对.NET API的有限知识在这里失败了。这是调试问题的正确方法吗?

    杰夫