Утечка памяти в WCF (дуплекс) на сервере - PullRequest
6 голосов
/ 21 февраля 2012

Привет, у меня довольно серьезные проблемы с Сервисом, выполняющим WCF в дуплексном режиме.Это приводит к утечке памяти (не так много, но это около 80 МБ в день), и после того, как профилировщик памяти работает вместе со службой в течение 24 часов, я обнаружил, что большая часть памяти находится в byte[], на которую ссылается довольно беспорядоквот так: one path holding the byte[] - array и «корень» выглядит так: root

Я тоже вижу много ServiceChannel (около 200) приходящих (я думаю) из callback-каналов.

Я довольно уверен, что я держу только 1 из них для каждого из подключенных клиентов.

В целом моя проблема, кажется, почти такая же, как эта: утечка памяти в реализации Silverlight Wcf но на стороне сервера.

Я даже попробовал упомянутую здесь вещь [MTAThread]: Служба WCF пропускает дескрипторы и память, когда клиент останавливает , но это просто не решаетпроблема.

Я просто не думаю, что проблема в моем коде, поскольку я обертываю обратные каналы после получения его с помощью OperationContext.Current.GetCallbackChannel<IServiceConnectorCallback>() в одном из моих собственных объектов, и те не протекают (тамтолько один из техдля каждого клиента в памяти в любой моментальный снимок) - уверен, что я несколько раз сбрасывал эти обратные вызовы, так как канал мог измениться (клиенты теряют соединение или переподключались), но у меня нет способа избавиться от старых ссылок, поэтому я только удаляюони и GC должны выполнить свою работу над ними.

Я использую PerCall в своем сервисе, поэтому я вообще не имею никакого отношения к этим объектам в моем коде.

Iдействительно не имею ни малейшего понятия о том, как я могу справиться с этим, кроме перезапуска службы каждые несколько дней - решение, которое я не хочу сейчас рассматривать: (

Поэтому, пожалуйста, дайте мне некоторую помощь / подсказки по этому вопросу - спасибовам очень нравится!

1 Ответ

7 голосов
/ 24 февраля 2012

Если канал на основе сеанса выходит из строя, вызов Close вызовет исключение. Однако есть ресурсы прокси-стороны, которые не очищаются в этом случае, и они очищаются только при Abort неисправном канале

Убедитесь, что при замене неисправного канала вы Abort сначала используете старый

...