Привет, у меня есть проблема с сервисом, работающим с WCF в дуплексном режиме. Он пропускает память (не так много, но это около 80 МБ в день), и после того, как профайлер памяти работает рядом с сервисом в течение 24 часов, я нашел большую часть памяти, сидящую в byte[]
, на которую ссылается довольно беспорядок, но я больше всего ссылаюсь на что-то вроде это: и «корень» выглядит следующим образом: Утечка памяти в 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 прямо сейчас :(
Поэтому, пожалуйста, дайте мне некоторые справки/подсказки на это - большое вам спасибо!
Вы видите более высокий выигрыш в памяти, если клиентский недостаток много, и вам нужно воссоздать канал обратного вызова? Вы отменяете канал обратного вызова, если клиент ушел? –
Мне сложно сказать, но это может быть так - и нет, я не прерываю канал на сервере (как я могу это сделать - с помощью 'GetCallbackChannel' Я только получаю 'T' - вам нужно отдать это в какой-то прокси?) –
Carsten
Вы должны быть в состоянии отправить его в 'IClientChannel' –