2009-05-15 20 views
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 

Czytałem o przypinaniu i fragmentacji. Wygląda na fragmentaryczny, biorąc pod uwagę ogromną ilość wolnej przestrzeni. Chyba muszę to teraz wyśledzić.Czy moja paczka jest pofragmentowana?

Myśli? informacje zwrotne?

+1

W rzeczywistości, posiadanie dużej ilości wolnego miejsca jest bardziej jak oznaka braku lub niewielkiej fragmentacji. – VVS

+2

Wyniki pokazują, że aplikacja ma 50315 uchwytów wolnej pamięci i najwyraźniej większość z nich ma mniej niż pół megabajta. Wydaje mi się to podzielone. –

Odpowiedz

5

Więc ... wiemy, że mamy rozdrobnioną kupę. Następne pytanie brzmi: co powoduje fragmentację? Co powstrzymuje uwalnianie wolnych obiektów? Zalecenia Przeczytałem jest zbadanie obiekty tuż po wolnej przestrzeni:

1) dumpheap -stat 2) Dump tabeli metoda Free obiektu: dumpheap -MT 000db8e8 3) Wybierz jeden wolny przedmiot z listy, aby przyjrzeć się dokładniej:! dumpobj 0x2003b0b0 4) Zapisz rozmiar obiektu 5) Zrzuć następny obiekt za nim:! dumpobj 0x2003b0b0 + 1000 6) Znajdź obiekt zawierający odniesienie! gcroot 0x2003b0b0 + 1000 7) Zrzuć ghask znalezionego obiektu.

Zwykle zestrzelam tę króliczą dziurę, a moja ograniczona wiedza na temat API .NET nie udaje się tutaj. Czy to jest właściwy sposób na usunięcie problemu?

Jeff

+1

Sprawdziłem, która sterta jest fragmentacją. Początkowo użyłem! Eeheap -gc, aby uzyskać podstawę do przeszukiwania segmentów, jednak SOSEX (http://www.stevestechspot.com/SOSEXV2NowAvailable.aspx) ma kilka poleceń właśnie w tym celu. Wygląda jak w stosie dużych obiektów (który jest oczekiwany jako nigdy nie zagęszczony) iw pewnym stopniu w stercie gen2. gen0 Nie dbam o to, a gen1 nie ma fragmentacji. Myślę, że to, co mówisz, spróbuj wymyślić obiekty, które są przypisane po fragmentacji, a następnie odtwórz stamtąd, aby zobaczyć, co powoduje fragmentację, tj.! Dumpobj 0x2003b0b0 + 1000 – Keith

Powiązane problemy