2010-09-09 33 views
13

Tôi đã có một sự chậm lại kỳ lạ trong trang web ASP.NET của tôi mà tôi dường như không thể theo dõi. Tôi nghi ngờ rằng GC có thể đá vào và ngăn chặn chủ đề của tôi. Để biết chắc chắn nó sẽ được tốt đẹp để đăng nhập mỗi khi GC xảy ra.Có sự kiện nào khi thu thập rác xảy ra trong .NET không?

Tôi có thể tạo đối tượng giả và đăng nhập vào trình hoàn thiện của nó, nhưng sau đó sẽ là giải pháp một lần, trong trường hợp của tôi có một số tạm dừng không thể giải thích được.

Bất kỳ ý tưởng nào?

Đã thêm: Môi trường là VS2008/.NET 3.5 SP1. Và không, các Garbage Collection Notifications sẽ không làm bởi vì họ là một phương pháp bỏ phiếu, và không làm việc cho một GC đồng thời.

+0

Điều đó tùy thuộc vào phiên bản khuôn khổ bạn đang sử dụng. –

+0

Câu hỏi thú vị mặc dù – serg10

Trả lời

2

Perhpas this bài viết (Thông báo thu thập rác) sẽ giúp ích.

bạn có thể được thông báo rằng một thu gom rác thải đầy đủ đang đến gần

+0

Nó không đảm bảo xảy ra, và nó giống như bỏ phiếu, trong khi tôi cần một sự kiện. –

1

Bạn có theo dõi Perf-mon? Bạn có thể xem CPU - tổng thể và theo quy trình, bộ nhớ .NET, bao gồm kích thước của từng thế hệ và số lượng của các loại GC. Bạn cũng có thể để perf-mon chạy và đăng nhập trong thời gian dài để xem các xu hướng. Tôi thấy điều này hữu ích hơn nhiều so với việc rời rạc 'nó đang xảy ra ngay bây giờ!' sự kiện.

+1

Cụ thể bạn có thể muốn đối tượng Hiệu suất Bộ nhớ .NET CLR. Từ đó bạn có thể nhận được Bộ đếm GC cho một Hồ bơi ứng dụng cụ thể. –

1

Câu trả lời đơn giản là "Không có sự kiện GC" chỉ có chức năng GCNotification ". Tuy nhiên bạn tạo một lớp bao bọc sẽ nghe GCNotification và trình bao bọc đó có thể kích hoạt các sự kiện, nhưng không có giải pháp sự kiện đơn giản nào như bạn đang tìm kiếm.

Lý do cho sự kiện này là sự kiện có thể hoặc không thể được xử lý trước khi GC hoàn tất. Vì vậy, những gì họ có bạn làm thay vì đẻ trứng một sợi con, ngủ trên WaitForFullGCApproach hoặc cực nếu bạn không tìm kiếm một GC đầy đủ, và làm bất cứ điều gì bạn cần làm trước khi GC xảy ra.

0

Bạn có thể muốn đọc bài viết này trên ASP.NET Performance Monitoring, and When to Alert Administrators

Nó bao gồm một phần trên GCcounters nhìn vào và những gì các giá trị có ý nghĩa. Ví dụ:

% Thời gian trong GC. Phần trăm thời gian dành để thực hiện bộ sưu tập rác cuối cùng . Giá trị trung bình 5% hoặc ít được coi là lành mạnh, nhưng số lần tăng lớn hơn số này không phải là không phổ biến. Lưu ý rằng tất cả các chủ đề là bị treo trong khi thu thập rác.

Bạn cũng có thể muốn xem blog If broken it is, fix it you should Có một số nghiên cứu điển hình từng bước về cách xác định vấn đề cụ thể. Ví dụ: ASP.NET Case Study: High CPU in GC - Large objects and high allocation rates

8

Đây là một mẹo đơn giản. Nó có thể không chính xác 100%, nhưng có lẽ nó sẽ đủ tốt.

Nếu bạn có thể sống với việc được thông báo về quyết toán, thì có một phương pháp đơn giản mà bạn có thể sử dụng.

Tạo đối tượng và không giữ tham chiếu đến đối tượng đó. Khi đối tượng được hoàn thành, bạn nâng cao sự kiện của bạn, và sau đó xây dựng một đối tượng khác.Bạn không giữ một tham chiếu đến đối tượng này, nhưng nó sẽ sống cho đến khi thời gian tiếp theo một bộ sưu tập đủ đầy đủ được thực hiện.

Dưới đây là ví dụ một đối tượng:

public class GCNotifier 
{ 
    public static event EventHandler GarbageCollected; 

    ~GCNotifier() 
    { 
     if (Environment.HasShutdownStarted) 
      return; 
     if (AppDomain.CurrentDomain.IsFinalizingForUnload()) 
      return; 
     new GCNotifier(); 
     if (GarbageCollected != null) 
      GarbageCollected(null, EventArgs.Empty); 
    } 

    public void Start() 
    { 
     new GCNotifier(); 
    } 
} 

Nếu bạn muốn, bạn có thể thêm hỗ trợ cho dừng nó bằng cách có một lĩnh vực boolean tĩnh mà ngăn không cho nó khởi động lại bản thân khi quyết toán tiếp theo.

Hy vọng đây là một số trợ giúp.

Các vấn đề liên quan