我的堆是否碎片化

2024-01-03

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. !dumpheap -stat

  2. 转储 Free 对象的方法表: !dumpheap -mt 000db8e8

  3. 从列表中选择一个自由对象以进行更仔细的检查:!dumpobj 0x2003b0b0

  4. 记录物体的大小

  5. 转储其后的下一个对象: !dumpobj 0x2003b0b0+1000

  6. 找到持有引用的对象!gcroot 0x2003b0b0+1000

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

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

Jeff

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的堆是否碎片化 的相关文章

随机推荐