2009-11-28 41 views
8

Điều gì sẽ xảy ra với WeakReference khi đối tượng đích được tham chiếu bởi WeakReference.Target đã được thu thập rác? Liệu các WeakRerence vẫn còn sống và giữ tồn tại? Lý do tôi yêu cầu là tôi có một danh sách các WeakReferences được lưu trữ trong Danh sách. Trong thời gian chạy WeakReferences mới liên tục đang được thêm vào danh sách đó. Bây giờ khi đối tượng mục tiêu chết, tôi có phải tự dọn dẹp bản thân WeakReference bị bỏ rơi không? Nếu vậy, có một mẹo thông minh làm thế nào tôi có thể làm điều này? Tôi có thể được thông báo khi WeakReference bị hủy bỏ không? Hoặc tôi có phải giới thiệu một bộ đếm thời gian mà thường xuyên lặp qua danh sách đó, để xem nếu bất kỳ trường hợp WeakReference có thể được loại bỏ khỏi danh sách đó.Điều gì xảy ra với WeakReference sau GC của WeakReference.Target

+0

Nhân tiện, làm tốt công việc của câu hỏi, tôi cảm thấy rất rõ vấn đề là gì mặc dù tôi hầu như không có kinh nghiệm với .net. –

Trả lời

12

Đây là vấn đề thường gặp với các tham chiếu yếu. Bản thân tài liệu tham khảo vẫn còn sống vì nó có con trỏ bình thường. Như bạn đề xuất, bạn cần phải thực hiện một số "bộ sưu tập rác thủ công" theo thời gian. Lưu ý rằng bạn có thể dọn sạch các cuống trên đường khi bạn đang đi qua danh sách vì một lý do khác. Tùy thuộc vào mẫu sử dụng cho danh sách, bộ sưu tập rác "ở bên cạnh" này thậm chí có thể đủ.

Không "thường xuyên" lặp lại danh sách với mục đích duy nhất là dọn dẹp nó! Mỗi cuống chết chỉ lãng phí một vài từ bộ nhớ. Nếu danh sách không được sử dụng thường thì chi phí tính toán của việc làm sạch nó thường không được biện minh, và nếu nó được sử dụng thường xuyên, nó sẽ tự làm sạch nó như đề xuất ở trên.

Hoàn toàn nằm trong một hệ thống thu gom rác khác, nhưng các vấn đề tương tự như vậy mà bạn có thể quan tâm đến this article nếu bạn có thể nhận được.

+0

Nếu danh sách sẽ không được truy cập theo chỉ mục, chính sách tốt nhất có thể là thanh lọc khi mục được thêm vào, nếu số mục được thêm vào giữa lần thanh lọc cuối cùng và bộ sưu tập cuối cùng (sử dụng bộ đếm GC) vượt quá phần nhỏ của kích thước danh sách. Điều gì quan trọng thường không phải là tất cả rác được làm sạch, mà là số lượng rác không đủ điều kiện để thu thập ngay lập tức vẫn bị ràng buộc. BTW, WeakReferences có giá cao hơn "một vài từ". Chúng không tốn kém khủng khiếp, nhưng ngay cả một triệu lần suy yếu không sử dụng cũng có thể làm nghẹt chương trình. – supercat

6

Vì bạn có tham chiếu mạnh mẽ đến đối tượng WeakReference, nó sẽ không nhận được GC'ed. Đây cũng là do thiết kế, bởi vì nó đã được dự định rằng bạn vẫn có thể sử dụng WeakReference để tìm ra rằng mục tiêu đã được GC'ed.

Vì vậy, có, bạn sẽ phải đi theo hẹn giờ.

Đã thêm: Bạn cũng có thể xem Garbage Collection Notifications.

+1

+1, nhưng tôi sẽ cảnh báo chống lại các thông báo GC, vì chúng vô hiệu hóa một số tính năng mới (đẹp) của GC. – user7116

1

Mục đích sử dụng là bạn đăng ký ReferenceQueue với WeakReferences. Khi mục tiêu được thu thập, tham chiếu sẽ được thêm vào hàng đợi. Bạn có thể thăm dò hoặc chờ đợi trên hàng đợi và loại bỏ các đối tượng WeakReference khỏi Danh sách của bạn.

+2

Bạn có chắc cơ chế này là .NET không? Tôi nghĩ rằng bạn đang đề cập đến Java ... – bitbonk

+0

Xin lỗi, tôi đã có một chút mù thẻ. Tôi không sử dụng bất kỳ NET. Vì vậy, có được bối rối khi các lớp học có chính xác cùng tên như thế này. – OrangeDog

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