Đ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
Trả lời
Đâ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.
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
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, 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
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.
- 1. Điều gì sẽ xảy ra với AsyncTasks sau onPause?
- 2. Điều gì đang xảy ra với java GC? Không gian PermGen đang lấp đầy?
- 3. Điều gì đã xảy ra với regtlibv12?
- 4. điều gì đã xảy ra với syscalls.h?
- 5. Điều gì đã xảy ra với NVD3?
- 6. Điều gì xảy ra với lớp System.Linq.Expressions.LogicalBinaryExpression?
- 7. Điều gì đã xảy ra với JSDT của Eclipse?
- 8. Điều gì đã xảy ra với java của emacs?
- 9. Điều gì sẽ xảy ra sau khi gói bị bắt?
- 10. INotifyPropertyChanged: điều gì xảy ra phía sau hiện trường?
- 11. C# Điều gì sẽ xảy ra với GC nếu tôi chạy quá trình với mức ưu tiên = RealTime?
- 12. Khi xảy ra gián đoạn, điều gì xảy ra với hướng dẫn trong đường ống?
- 13. Điều gì đã xảy ra với ngoại lệ trong Perl?
- 14. Điều gì đã từng xảy ra với XPathReader
- 15. Điều gì đã xảy ra với Android AAPT?
- 16. Điều gì xảy ra với thuộc tính [OptionalField]?
- 17. Điều gì đang xảy ra với mã Lisp chung này?
- 18. Điều gì sẽ xảy ra với cửa sổ WPF sau khi đóng?
- 19. Điều gì xảy ra với pixel sau khi chuyển chúng vào glTexImage2D()?
- 20. Điều gì đã xảy ra với startx trên Cygwin?
- 21. Điều gì đã xảy ra với biến môi trường TMP?
- 22. Điều gì đã xảy ra với StringDecoder trong Dart?
- 23. Điều gì đang xảy ra với purecss ở đây?
- 24. HttpClient 4 - Điều gì đã xảy ra với MultiThreadedHttpConnectionManager?
- 25. Điều gì xảy ra nếu lỗi mới?
- 26. Điều gì sẽ xảy ra với con trỏ FILE sau khi tệp được đóng?
- 27. Python + JSON, điều gì đã xảy ra với Không?
- 28. Điều gì đã xảy ra với types.ClassType trong python 3?
- 29. Điều gì đã xảy ra với Project Volta?
- 30. Điều gì đang xảy ra trong __libc_start_main?
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. –