2009-07-08 36 views
25

Tôi hiểu và đánh giá cao tính hữu dụng của lớp System.WeakReference trong khuôn khổ .NET, nhưng tôi tò mò về chi tiết triển khai.Triển khai WeakReference trong .NET

WeakReference được triển khai bằng .NET như thế nào? MSDN thảo luận về việc sử dụng WeakReference một cách chi tiết, nhưng có rất ít chi tiết mà tôi đã thấy về cách thức hoạt động của nó dưới mui xe.

CLR theo dõi tham chiếu và biết làm thế nào để loại bỏ tay cầm bên trong khi Target được thu thập, mà không ngăn cản GC? Liệu nó có cần xử lý đặc biệt trong CLR không?

Mối quan tâm chính của tôi là liệu có tác động hiệu quả của việc sử dụng WeakReferences (đặc biệt là nếu sử dụng nhiều chương trình) khác với sử dụng tham chiếu tiêu chuẩn.

+5

Tôi đã thực hiện khá nhiều nghiên cứu và viết về các phát hiện của mình một cách chi tiết: http://reedcopsey.com/?p=50 –

Trả lời

19

Lớp WeakReference đưa tham chiếu đối tượng của nó tới GC và lấy lại một tay cầm. Bất cứ khi nào bạn nhận được các tài liệu tham khảo hoặc kiểm tra xem tài liệu tham khảo là còn sống, xử lý được sử dụng để yêu cầu GC để tham khảo.

Điều này có nghĩa là GC giữ một danh sách tất cả các tham chiếu yếu, mà nó phải cập nhật khi đối tượng được thu thập. Nó cũng có nghĩa là có một số chi phí mỗi khi bạn sử dụng một tham chiếu yếu.

Vì vậy, mọi tham chiếu yếu có nghĩa là một ít công việc hơn cho bộ thu gom rác, nhưng mặt khác cũng vậy, mỗi lần tham chiếu đều đặn, ngay cả khi nó ít hơn. Dĩ nhiên bạn nên cẩn thận khi sử dụng rất nhiều tài liệu tham khảo yếu, nhưng nếu bạn cần điều đó để quản lý bộ nhớ hoạt động tốt với các đối tượng của bạn, điều đó sẽ vượt quá chi phí nhỏ mà nó gây ra.

+1

Tôi sẽ đặt câu trả lời này là câu trả lời vì đó là mô tả cơ bản, tốt về quy trình. Cảm ơn Guffa. –

13

Bạn đã đề cập đến MSDN; bạn đã xem bài viết này chưa?

http://msdn.microsoft.com/en-us/magazine/bb985011.aspx

Ngoài ra kiểm tra chương 19 trong "Ứng dụng Microsoft .NET Framework Programming" bởi cùng một tác giả (Jeffrey Richter). Chương này nằm trong bộ sưu tập rác và có một phần về nội bộ WeakReference.

Nói chung, nếu bạn đang truy cập rất nhiều Targets trong WeakReferences, thì có hiệu suất chỉ đơn giản vì WeakRef thực hiện một số công việc (chủ yếu cho an toàn luồng) trước khi trả về đích. Điều này rõ ràng không phải là rẻ như sử dụng trực tiếp đối tượng tham chiếu. Mặt khác, bạn có được một số hiệu suất khi lưu trữ các tham chiếu đến các đối tượng lớn, vì bộ thu gom rác có nhiều tùy chọn hơn khi các cân nhắc bộ nhớ nảy sinh.

Tôi chưa bao giờ cố định lượng hóa giao dịch này hoặc biết bất kỳ tham chiếu nào tại đây. Rõ ràng nó thay đổi một chút tùy thuộc vào ứng dụng.

+2

+1 và cảm ơn tài liệu tham khảo. Chỉ cần FYI, tôi đã nghiên cứu nhiều hơn và có rất ít chi phí cho sự an toàn của luồng trong WeakReference - chủ yếu là việc GCHandle phải trả lại đối tượng, hoạt động như dereferencing hai lần, cộng với một vài kiểm tra null. –

+0

Tôi nghĩ rằng tôi nhớ đã nhìn thấy rằng một vài năm trước đây, nhưng tôi thực sự cần phải xác nhận nó trước khi đưa nó xuống trong câu trả lời. Cảm ơn vì đã chú ý điều đó, Reed. – ars

+0

+1 cho tài liệu tham khảo hữu ích. –

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