Tôi phân tích dự án VB.NET và có một số đối tượng (mẫu con MDI) được xử lý, nhưng không bị xóa bởi GC.Xử lý sự kiện và rò rỉ bộ nhớ
Phân tích MemoryProfiler tìm, trong số những người khác, như sau:.
"Ví dụ này được xử lý và vẫn gián tiếp bắt nguồn bởi một EventHandler này thường chỉ ra rằng EventHandler vẫn chưa đúng loại bỏ và là một nguyên nhân phổ biến của rò rỉ bộ nhớ. Các trường hợp bên dưới là trực tiếp bắt nguồn từ EventHandler (s). Điều tra chúng để nhận được thêm thông tin về sự cố này ... "
Bây giờ, tôi cố gắng tìm hiểu ý nghĩa của điều này và cách khắc phục.
Tôi có biểu mẫu MDI và biểu mẫu con. Biểu mẫu con không được GC thu thập sau khi mở/đóng, rõ ràng vì vẫn còn (gián tiếp?) Được tham chiếu bởi MDIForm EventHandlerList
...
Tôi có thể làm gì và cách khắc phục?
tôi đã cố gắng sửa chữa đề nghị trong this thread, bởi vì đã có một vấn đề với các tài liệu tham khảo MDI trong PropertyStore
, bây giờ điều này loại bỏ, nhưng đã xuất hiện các tài liệu tham khảo MDI EventHandlerList
mẫu trẻ ...
Sau khi một số mã phân tích tôi đã quan sát một số
AddHandler newMenu.Click, AddressOf ClickMenu
không có trước RemoveHandler newMenu.Click, AddressOf ClickMenu
. Nó có thể là nguyên nhân chính?
Và, một Propos, là Handles
Private Sub ClickMenu(sender as Object, e as EventArgs) Handles newMenu.Click
tốt hơn mà
RemoveHandler newMenu.Click, AddressOf ClickMenu
AddHandler newMenu.Click, AddressOf ClickMenu
từ quan điểm cấp phát bộ nhớ của xem?
Việc cắt mã có thể hữu ích. Đặc biệt là thêm và loại bỏ xử lý sự kiện và xử lý mã. –
Gọi GC.Collect() sau khi xử lý có thực hiện bất kỳ sự khác biệt nào không? Chỉ vì một cái gì đó được xử lý không phải lúc nào cũng có nghĩa là rác được thu gom ngay lập tức. – Ian
Ngoài ra .. đây thực sự là một vấn đề? Đọc một diễn đàn mà bạn liên kết để gợi ý rằng điều này không tệ hơn theo thời gian. Là một vài kb bị rò rỉ thông qua mã MS sẽ có một tác động lớn? – Ian