2009-05-15 13 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 

Tôi đã đọc về ghim và phân mảnh. Cái nhìn của nó bị phân mảnh với tôi vì lượng lớn không gian trống. Tôi đoán tôi phải theo dõi nó.Đống của tôi bị phân mảnh

Suy nghĩ? Phản hồi?

+1

Thực tế, có nhiều không gian trống giống như dấu hiệu không có hoặc ít phân mảnh. – VVS

+2

Đầu ra cho thấy ứng dụng có 50315 bộ nhớ miễn phí và dường như hầu hết trong số chúng đều nhỏ hơn một nửa megabyte. Điều đó có vẻ phân mảnh với tôi. –

Trả lời

5

Vì vậy, chúng tôi biết chúng tôi có một đống phân mảnh. Câu hỏi tiếp theo là: điều gì gây ra sự phân mảnh? Điều gì khiến các đối tượng miễn phí này được phát hành? Các khuyến nghị Tôi đã đọc là để kiểm tra các đối tượng ngay sau khi không gian trống:

1) dumpheap -stat 2) Dump bảng phương pháp của đối tượng miễn phí: dumpheap-MT 000db8e8 3) Chọn một đối tượng miễn phí từ danh sách để kiểm tra chặt chẽ hơn:! dumpobj 0x2003b0b0 4) Ghi lại kích thước của đối tượng 5) Đổ đối tượng tiếp theo sau nó:! dumpobj 0x2003b0b0 + 1000 6) Tìm đối tượng đang nắm giữ tham chiếu! gcroot 0x2003b0b0 + 1000 7) Dump gchandle của đối tượng tìm thấy.

Tôi thường đi xuống lỗ thỏ này và kiến ​​thức hạn chế về API .NET của tôi không thành công ở đây. Đây có phải là cách đúng để gỡ lỗi sự cố không?

Jeff

+1

Tôi đã có một cái nhìn mà đống là phân mảnh. Ban đầu tôi sử dụng eeheap -gc để có cơ sở cho các phân đoạn tìm kiếm, tuy nhiên SOSEX (http://www.stevestechspot.com/SOSEXV2NowAvailable.aspx) có một số lệnh chỉ dành cho việc này. Nó trông giống như của nó trong đống đối tượng lớn (được dự kiến ​​là nó chưa bao giờ nén) và ở một mức độ nào đó trong vùng gen2. gen0 Tôi không quan tâm và gen1 không có phân mảnh. Tôi nghĩ những gì bạn nói là cố gắng tìm ra các đối tượng được chỉ định sau khi phân mảnh rồi làm việc trở lại từ đó để xem những gì gây ra sự phân mảnh, nghĩa là! Dumpobj 0x2003b0b0 + 1000 – Keith