2009-05-06 37 views
5

Tôi đã tìm thấy một số bài viết tuyệt vời (Maoni, Richter #1, Richter #2) cung cấp nhiều chi tiết về lý thuyết và thực hành của GC, nhưng tôi không thể tìm thấy bất kỳ điều gì nêu rõ mức độ ưu tiên luồng của GC..NET Garbage Collector - ưu tiên luồng của nó là gì?

Gần nhất tôi đã tìm thấy là một này mà nói rằng thread finalizer "runs asynchronously to the application and at a high priority."

Tôi luôn luôn nghĩ rằng đó là một "ưu tiên thấp" chủ đề, nhưng đọc ngày càng nhiều về nó mà có vẻ là sai (vì GC phải chặn tất cả các chuỗi khác của bạn và bạn không muốn ứng dụng của mình phụ thuộc vào chuỗi có mức độ ưu tiên thấp để tiếp tục một cách kịp thời).

Có ai biết chắc chắn biết ưu tiên thực sự được cho là gì không?

Trả lời

9

Trong CLR thông qua C#, Richter giải thích rằng:

Một ưu tiên cao chủ đề CLR đặc biệt là dành riêng cho gọi Finalize phương pháp

(hãy xem phần "Quyết toán Internals" tiêu đề của chương 20)

Đây là ngữ cảnh duy nhất trong đó ông nói về một chuỗi thu rác. Một chút trước đó trong chương này, ông giải thích rằng thu gom rác thải được bắt đầu để đáp ứng với một trong những sự kiện sau đây:

  • thế hệ 0 là đầy đủ
  • Gọi để GC.Collect
  • Windows được báo cáo điều kiện bộ nhớ thấp
  • Các CLR được dỡ một AppDomain
  • Các CLR được tắt

... điều này gợi ý rằng luồng duy nhất được tạo ra bởi bộ thu gom rác là duy nhất, chủ đề finalizer "ưu tiên cao" này.

Edit: Sau đó, ông tiếp tục, trong "đồng thời Bộ sưu tập", để giải thích rằng:

Trên một hệ thống đa xử chạy phiên bản máy trạm của động cơ thực hiện, thu gom rác có một sợi nền thêm để thu thập đồng thời các đối tượng trong khi ứng dụng chạy. [...] Bộ thu gom rác có chuỗi nền ưu tiên bình thường đánh dấu các đối tượng không thể truy cập được.

+0

Điều này dường như gần với một câu trả lời đầy đủ như tôi có thể nhận được. Tôi sẽ để nó mở lâu hơn một chút, nhưng tôi nghĩ điều này có thể làm được. Cảm ơn! Tìm hiểu một cái gì đó mới mỗi ngày, huh? Có lẽ tôi nên mua cuốn sách của anh ấy. –

+1

Tôi chắc chắn có thể giới thiệu cuốn sách của anh ấy - đó là thông tin cơ bản thú vị và nó đã giúp tôi lưu lại một số vấn đề cụ thể. –

+0

Tôi nghĩ đây là một trong những trường hợp hiếm hoi mà tôi không thể tìm thấy câu trả lời trực tuyến, nhưng một cuốn sách dường như có câu trả lời đầy đủ chi tiết. Cảm ơn! –

5

Chuỗi GC chạy ở mức độ ưu tiên thông thường. Chuỗi kết thúc chạy ở mức ưu tiên "Cao nhất".

Bạn có thể thấy điều này bằng cách bật cửa sổ Gỡ lỗi "Chủ đề" và phá vỡ bất kỳ đâu trong ứng dụng được quản lý. Các chủ đề đều được liệt kê (mặc dù chúng không được đặt tên), với các ưu tiên của chúng. Phải mất một chút để giải mã mà là, nhưng sẽ có một chuỗi ưu tiên "Bình thường" và "Cao nhất", tương ứng với chuỗi GC và chuỗi Finalizer.

+0

Đó dường như có ý nghĩa (bình thường đối với GC, cao nhất cho finalizer như vậy là để lấy lại mà không bị Bị giành trước) . Tôi chỉ tự hỏi tại sao đó không phải là explictly giải thích bất cứ nơi nào trên MSDN. Bạn đã có thể tìm thấy bất cứ điều gì nhiều hơn "chính thức" hơn là chỉ bắn lên cửa sổ Thread? –

+0

Tôi không biết bất kỳ điều gì cụ thể. Tôi đã học được một số điều này trong một thời gian trở lại tại một buổi nói chuyện hội nghị của Rico Mariani nói về sự hoàn hảo. trong .NET - Tuy nhiên, hầu hết các tài liệu MSDN về cơ bản nói để bỏ qua các nội bộ GC và chỉ tin tưởng chúng - và cũng không dựa vào chúng ở cùng, bởi vì chúng được tự do thay đổi tại bất kỳ điểm nào (và có trong quá khứ). –

0

bộ gom rác chạy ở mức ưu tiên thấp hơn so với đề quan trọng

0

Các ưu tiên thread GC là một chi tiết thực hiện, ngay bây giờ họ đang chạy trong ưu tiên bình thường, tuy nhiên thread finalizer đang chạy như một ưu tiên cao và cũng có thời gian chờ.

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