2010-06-21 54 views
12

Khi tôi gỡ lỗi mã .net, làm thế nào tôi có thể biết khi nào bộ thu gom rác chạy?Khi nào bộ thu gom rác net hoạt động?

Tôi không muốn kiểm soát khi bộ thu gom rác chạy. Tôi chỉ muốn có thể biết khi nào nó đang chạy. Tôi có một số mã đang cạn kiệt tài nguyên. Tôi biết rằng các nguồn lực không được sử dụng; Tôi muốn biết khi nào GC đang chạy để giải phóng chúng.

Oh, và các nguồn tài nguyên tôi có trong tâm trí các kết nối từ một kết nối hồ bơi Sql, không nhớ :-)

+1

Tại sao bạn cần biết khi nào nó chạy? –

+0

Bộ thu gom rác chỉ thu gom rác (theo định nghĩa), tức là các đối tượng không còn được chương trình của bạn tham chiếu nữa. – Ken

+8

Hỏi câu hỏi này giống như hỏi một ông chủ đám đông khi lô hàng thuốc tiếp theo của anh ta được lên kế hoạch đến. Câu trả lời là 'không có doanh nghiệp nào của bạn' theo sau bởi một công ty :: smack :: vào mặt sau của đầu :) –

Trả lời

5

Bạn phải sử dụng .NET 4.0, những gì bạn đang yêu cầu không được hỗ trợ trong các phiên bản eariler.

Về cơ bản, bạn gọi phương thức WaitForFullGCApproach và WaitForFullGCComplete trong vòng lặp. WaitForFullGCApproach sẽ chặn cho đến khi bạn nhìn thấy một GC, WaitForFullGCComplete sẽ chặn cho đến khi GC hoàn tất.

Vui lòng đọc kỹ bài viết này. Nếu bạn sử dụng phương pháp này sau đó bạn có trách nhiệm cho makign chắc chắn bộ sưu tập rác thực sự xảy ra. Nếu bạn mess này lên, bạn có thể phá vỡ GC và nhanh chóng hết bộ nhớ.

http://msdn.microsoft.com/en-us/library/cc713687.aspx

9

Bạn không nên, nói chung, không bao giờ lo lắng hay suy nghĩ về khi chạy GC.

Bộ thu gom rác sẽ chạy khi cần thiết, vào thời điểm không xác định được chọn theo thời gian chạy.

Nếu bạn muốn kiểm soát hạt tốt hơn trên GC (mà tôi không khuyên bạn nên ngoại trừ trong trường hợp rất cụ thể), bạn có thể sử dụng GC.AddMemoryPressureGC.RemoveMemoryPressure. Những điều này sẽ không buộc GC phải chạy, mà đúng hơn là gợi ý rằng nó có bộ nhớ khác trong trò chơi khác với bộ nhớ được quản lý, cấp phát CLR. Điều này có khả năng sẽ làm cho nó chạy thường xuyên hơn, điều này có thể hữu ích nếu bạn đang phân bổ khối bộ nhớ lớn trong mã gốc.

Không có API trực tiếp nào để theo dõi các lần chạy GC. (Ví dụ, lớp GC không chứa bất kỳ sự kiện nào thông báo về việc thu gom rác xảy ra.) Cách trực tiếp duy nhất để biết, cụ thể, khi GC đang thực hiện là sử dụng profiling API.

+0

Tôi đã tìm thấy một số tài liệu chỉ ra rằng .net theo dõi bộ nhớ và tối ưu hóa GC chạy dựa trên đó. Điều đó có nghĩa là tôi đang ở ngoài trời lạnh nếu tôi cần GC để chạy đến các kết nối miễn phí đến một máy chủ SQL? –

+0

@Rising Star: Không. Một kết nối SQL là một vấn đề riêng biệt từ bộ nhớ. Bạn có thể đóng nó bằng tay thông qua conn.Close(): http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx –

+0

Hrm ... Tại sao downvoting ở đây? –

1

Trong khuôn khổ .NET, GarbageCollector chạy bạn.

Trong mọi mức độ nghiêm trọng, .Net được thiết lập để tối ưu hóa GC. Nó có thể xảy ra ở phần cuối của một cuộc gọi phương thức, hoặc nó có thể chạy trong một ngày mà không cần phải là GC'd. Có lý do cụ thể nào bạn cần biết khi được thu thập không?

2

Bất cứ khi nào nó cảm thấy như nó

Các nhà sưu tập NET rác là một generational garbage collector. Có chắc chắn là một phương pháp để điên rồ nhưng nó không chính xác một cái gì đó bạn có thể dự đoán chính xác.

3

Thu gom rác không giải phóng kết nối cơ sở dữ liệu gộp chung của bạn. các kết nối được trả về hồ bơi khi bạn đóng/vứt bỏ đối tượng kết nối. hồ bơi kết nối tự quản lý khi nó cần mở nhiều kết nối hơn và đóng lại chúng dựa trên mức độ khó khăn của bạn khi nhấn vào nhóm của bạn và cấu hình của nhóm của bạn trong chuỗi kết nối. thu gom rác không liên quan đến điều này bằng bất kỳ cách nào khác ngoài việc đòi lại bộ nhớ được cấp phát cho các cá thể của SqlConnection. bạn đang sủa cây sai trong việc hỏi về thu gom rác thải và nhận được (và chấp nhận) câu trả lời mà không có bất cứ điều gì để làm với những gì bạn đang sau (nếu tôi hiểu câu hỏi của bạn một cách chính xác).

0

Hai trong số các lý do nổi bật để GC chạy là a) nếu thế hệ 0 đầy b) khi heap đầy. lịch sự - CLR Qua C#, Jeffrey Richter