Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Memory leak in WCF (Duplex) on Server

Hi have quite a problem with an Service running WCF in duplex-mode. It leaks memory (not much but it's about 80MB a day) and after having a memory-profiler running alongside the service for 24 hours I found most of the memory sitting in byte[] referenced by quite a mess but I most references end in something like this: one path holding the byte[] - array and the "root" looks like this: root

I too see lots of ServiceChannel (around 200) comming (I think) from the callback-channels.

I'm rather sure that I only hold 1 of those for each of the connected clients.

Overall my problem seems to be almost the same as this: memory leak in silverlight Wcf implementation but on the server-side.

I even tried the [MTAThread] thing mentioned here: WCF service leaks handles and memory when a client times out but it just don't solve the problem.

I just don't think that the problem is with my code as I wrap the callback-channels after getting it with OperationContext.Current.GetCallbackChannel<IServiceConnectorCallback>() in one of my own objects and those don't leak (there is only one of those for each clients in memory at any given snapshot) - sure I reset those callbacks on several occasions as the channel might change (clients losing the connection or reconnecting) but I don't have a way of disposing the old references so I only drop them and the GC should do it's job on them.

I do use PerCall on my service so I don't have any handle to those objects in my code at all.

I really have no clue at how I can handle this aside from restarting the service every few days - a solution I don't want to probose right now :(

So please give me some help/hints on this - thank you very much!

like image 707
Random Dev Avatar asked Feb 21 '12 07:02

Random Dev


1 Answers

When a session based channel faults a call to Close will throw an exception. However, there are proxy side resources that are not cleaned up in this case and these are only cleaned up when you Abort the faulted channel

Make sure that when you replace a faulted channel that you Abort the old one first

like image 192
Richard Blewett Avatar answered Nov 06 '22 21:11

Richard Blewett