Разбита ли моя куча

118
11

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


Я читал о закреплении и фрагментации. Его взгляд фрагментирован для меня, учитывая огромное количество свободного места. Наверное, теперь я должен отследить его.


Мысли? обратная связь?

спросил(а) 2009-05-15T23:28:00+04:00 11 лет назад
1
Решение
93

Итак... мы знаем, что у нас фрагментированная куча. Следующий вопрос: что вызывает фрагментацию? Что не освобождает эти свободные объекты? Рекомендации, которые я прочитал, - это изучить объекты сразу после свободного пространства:


1)! dumpheap -stat
2) Сбросьте таблицу методов Свободного объекта:! Dumpheap -mt 000db8e8
3) Выберите один свободный объект из списка, чтобы более внимательно изучить:! Dumpobj 0x2003b0b0
4) Запишите размер объекта
5) Сбросьте следующий объект после него:! Dumpobj 0x2003b0b0 + 1000
6) Найдите объект, содержащий ссылку! Gcroot 0x2003b0b0 + 1000
7) Сбросьте gchandle найденного объекта.

Я обычно спускаюсь с этой кроличьей дыры, и мои ограниченные знания .NET API здесь не срабатывают. Это правильный способ отладки проблемы?


Джефф

ответил(а) 2009-05-18T22:37:00+04:00 11 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема