简体   繁体   中英

Unregistered event handlers cause memory leak

I'm maintaining a web application that has a memory leak.

Based on my investigation using Red Gate ANTS memory profiler I'm pretty sure that the memory leak is caused by event handlers in the business layer.

There's a collection that registers an event handler on each item that's added so that the collection can re-sort when the item's date is changed. It appears that this event handler is the culprit.

The business layer for this application is quite complicated, so keeping the collection and its items in memory drags a bunch of other objects with it.

I've implemented IDisposable on the collection and removed the event handlers in the Dispose method:

p.OnPunchDateChanged -= this.OnPunchDateChanged;

However, implementing IDisposable doesn't help since I can't wrap all the references to the collection in using or try/catch blocks. This collection is used by portions of the application that I don't have control over.

How can I clear these event handlers to resolve this memory leak?

First off, just to prove the point, try logging the adding and removal of events to a simple text file. Then, check how many were added vs removed.

It sounds as if there is a bug somewhere in the business logic which is not unregistering the event in all circumstances.

The Dispose method on the collection should be called directly by your code because the event holds a reference to the collection. Your collection will never be destroyed by garbage collector.

You should also change the behaviour of the Remove and Clean methods of the collection to detach the event handler from the removed items.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM