2012-02-08 35 views
9

Tôi thấy một số mẫu thu thập rác bất thường dưới .net 4.0 mà tôi không thể giải thích, mọi lời khuyên sẽ được đánh giá cao.Các mẫu sưu tập rác bất thường

Tại các thời điểm khác nhau trong việc chạy chương trình của tôi, số lượng bộ sưu tập G2 bắt đầu tăng và thời gian GC% tăng lên gần 100%. Điều này tiếp tục trong một thời gian trước khi dừng (vui lòng xem màn hình Performance Monitor lấy bên dưới). Trong thời gian này, một dấu vết PerfView của các sự kiện GC ETW CLR cho thấy rằng một số bộ sưu tập G2 đang chạy dài đang được kích hoạt ngược trở lại với lý do 'AllocSmall'.

bất cứ ai có thể làm sáng tỏ về:

  1. Preciesly những gì gây ra một 'AllocSmall' sự kiện
  2. Tại sao chúng được kích hoạt trực tiếp thu G2
  3. Tại sao những bộ sưu tập G2 đang xảy ra trở lại trở lại

LowMemory có vẻ không phải là vấn đề khi sự kiện bắt đầu GC không thực hiện điều này làm mã lý do của chúng (http://msdn.microsoft.com/en-us/library/ff356162.aspx). Chúng tôi cũng đã thấy các tình huống tương tự trong đó các bộ sưu tập G0 xuất hiện trở lại.

Chỉnh sửa: Người ta cho rằng trình kích hoạt có thể vượt quá ngưỡng. Do vẫn còn bộ nhớ có sẵn, tôi hy vọng rằng heap G2 sẽ mở rộng vào thời điểm này thay vì có GC thrash cố gắng thu thập.

Chỉnh sửa: Hình ảnh được đăng bên dưới có độ phân giải cao hơn nhiều so với hiển thị StackOverflow - chỉ cần mở liên kết hình ảnh trực tiếp trong tab trình duyệt.

Performance Monitor Trace PerfView Event Trace

Trả lời

3

Reasons Garbage Collect Occurs:

  1. Hệ thống có bộ nhớ vật lý thấp.

  2. Bộ nhớ được sử dụng bởi các đối tượng được phân bổ trên vùng được quản lý vượt quá ngưỡng chấp nhận được. Điều này có nghĩa là một ngưỡng sử dụng bộ nhớ chấp nhận được đã được vượt quá trên vùng quản lý. Ngưỡng này được điều chỉnh liên tục khi quá trình chạy.

  3. Phương pháp GC.Collect được gọi. Trong hầu hết các trường hợp, bạn không phải gọi phương thức này, vì bộ thu gom rác chạy liên tục. Phương pháp này chủ yếu được sử dụng cho các tình huống và thử nghiệm duy nhất.

Có vẻ như # 2 là trường hợp, tức là bạn đã 'vượt qua ngưỡng chấp nhận được'. 1 cho Microsoft mơ hồ.

+0

Cảm ơn bạn đã trả lời. Trong những trường hợp này, tôi hy vọng rằng heap G2 sẽ được mở rộng vì vẫn còn bộ nhớ. Bất cứ ai có thể bình luận về lý do tại sao điều này đã không xảy ra? –