Утечка памяти в перекрывающихся данных на сокетах
Я использую Async Socket для установления соединения между клиентом и сервером с помощью документов MSDN:
https://msdn.microsoft.com/en-us/library/fx6588te(v=vs.100).aspx
https://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.100).aspx
Я начал с Синхронного, а затем с Асинхронного. После успешного завершения моего первого приложения я начал искать в репозиториях GitHub больше кода и больше объяснений. Я нашел это:
https://github.com/perrybutler/csharpsockets
И это хорошо, это работает, но у него есть утечка памяти, и я начал Profiling, я нашел это:
(Возможная утечка памяти)
(С Cycle Detected statments повсюду. Понимаю, что они значат. Я полагаю, что приложение или GC принудительно остановили его и пометили как цикл).
Я думаю, что-то не так, потому что, если вы отправляете около 1 МБ данных, память должна только увеличиться на 1 МБ, но позже уменьшится. Но этого не происходит. Я начал избавляться от всего, не вызывая исключения, но это не сильно помогло.
Я начал искать это в Stackru и в других местах, и я нашел это:
.NET не имеет надежной асинхронной сокетной связи?
Однако я не очень понимаю, что там обсуждается.
Я также нашел это:
https://www.codeproject.com/Articles/83102/C-SocketAsyncEventArgs-High-Performance-Socket-Cod
Я прочитал, что сокеты должны подтвердить, когда он уже отправляет данные между BeginSend/EndSend & BeginReceive/EndReceive, потому что если нет, он будет ждать этого и начнет увеличивать память (пока не будет обнаружен цикл?)
Может быть, с CodeProject, которым я поделился, я должен получить это? Я не знаю, с чего мне начать.
Мне нужно руководство для этого. Я постараюсь профилировать CodeProject.
1 ответ
У меня была такая же проблема, мой неправильный код:
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
Фиксированный код:
using (NetworkStream stream = client.GetStream())
{
stream.Write(data, 0, data.Length);
}