У меня есть довольно проблема с сервисом, работающим WCF в дуплексном режиме.
Он утекает памяти (не много, но это около 80MB в день) и после того, как memory-profiler работает рядом с сервисом в течение 24 часов, я обнаружил, что большая часть памяти сидит в byte[]
ссылается довольно беспорядочно, но я большинство ссылок заканчивается примерно так:
, а "корень" выглядит так:
Я тоже вижу много ServiceChannel
(около 200), исходящих (я думаю) из callback-каналов.
Я уверен, что у меня только 1 из них для каждого из подключенных клиентов.
В целом моя проблема выглядит почти так же, как и эта: утечка памяти в реализации Silverlight Wcf, но на стороне сервера.
Я даже пробовал [MTAThread]
вещь, упомянутую здесь: WCF сервис сливает дескрипторы и память, когда клиент завершает работу, но это просто не решает проблему.
Я просто не думаю, что проблема в моем коде, так как я оборачиваю callback-каналы после получения их с помощью OperationContext.Current. GetCallbackChannel
в один из моих собственных объектов и они не утекают (в памяти есть только один такой канал для каждого клиента в любой момент времени) - конечно, я сбрасываю эти обратные вызовы несколько раз, так как канал может измениться (клиенты теряют соединение или подключаются снова), но у меня нет способа утилизации старых ссылок, поэтому я только сбрасываю их, и GC должен сделать свою работу над ними.
Я использую PerCall
в своем сервисе, поэтому в моем коде вообще нет никаких манипуляторов с этими объектами.
Я действительно не знаю, как я могу справиться с этим, кроме перезапуска службы каждые несколько дней - решение, которое я не хочу пробовать прямо сейчас :(
Поэтому, пожалуйста, дайте мне какую-нибудь помощь/подсказку по этому вопросу - большое спасибо!