2012-02-21 2 views
6

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

Я тоже вижу много ServiceChannel (около 200), пришедшего (я думаю) от обратного вызова каналов.

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

В целом моя проблема кажется почти такой же: memory leak in silverlight Wcf implementation, но на стороне сервера.

Я даже попробовал [MTAThread] вещь, упомянутая здесь: WCF service leaks handles and memory when a client times out, но это просто не решит проблему.

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

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

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

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

+0

Вы видите более высокий выигрыш в памяти, если клиентский недостаток много, и вам нужно воссоздать канал обратного вызова? Вы отменяете канал обратного вызова, если клиент ушел? –

+0

Мне сложно сказать, но это может быть так - и нет, я не прерываю канал на сервере (как я могу это сделать - с помощью 'GetCallbackChannel ' Я только получаю 'T' - вам нужно отдать это в какой-то прокси?) – Carsten

+1

Вы должны быть в состоянии отправить его в 'IClientChannel' –

ответ

7

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

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

+0

большое спасибо! – Carsten