Как узнать, утечка памяти или нет, увеличивается ли использование памяти в диспетчере задач - PullRequest
3 голосов
/ 13 июля 2011

Я написал небольшой класс Server, который в основном представляет собой оболочку TcpListener и средство для создания потоков ThreadPool.

Потоки запускают Server :: ProcessMessage (), который выполняет некоторую работу, отправляя сообщения туда и обратно, а затем завершает работу в концеоб этом.

Но непосредственно перед выходом из функции я также вызываю TcpClient.GetStream (). Close (), а затем TcpClient.Close ().Я не использую Mutex или ManualResetEvent WaitHandles.

Протестировал клиент и сервер, все работает, кроме диспетчера задач, он показывает, что использование памяти продолжает увеличиваться на каждом сервере :: ProcessMessage ().Даже после того, как все клиентские приложения были отключены и закрыты, использование памяти все еще там, но не уменьшилось.

Сервер работает как служба Windows.

Как узнать, является ли это знакомутечки памяти или просто сборщик мусора не выполняет свою работу (пока)?

Спасибо.

РЕДАКТИРОВАТЬ: Я думаю, что нашел причину моей "утечки памяти".У меня был Console.WriteLine () в моем Server :: ProcessMessage ().Тем не менее, было бы полезно, если бы был более простой способ проверить наличие проблем с памятью.

Ответы [ 2 ]

2 голосов
/ 13 июля 2011

Попробуйте использовать WinDbg с расширением SoS , чтобы проверить, есть ли в куче ссылки на ненужные объекты.Проверьте также эту ссылку .

Обычно вы начинаете с использования !DumpHeap -type (some-type-or-just-namespace), чтобы получить список объектов определенного типа (обычно я просто пишу пространство имен соответствующего слоя, чтобы получить список или объектыкоторый, я считаю, может быть еще в памяти).

Если у вас есть более одного экземпляра определенного объекта, вам нужно будет выбрать один адрес, который соответствует MT для вашего объекта, а затем вызвать !gcroot (your-address)чтобы увидеть, что поддерживает ваш объект в живых.

В большинстве случаев объекты остаются живыми, потому что один из их методов зарегистрирован в качестве обработчика событий для события какого-либо другого объекта.Хорошая практика - всегда отсоединять ваши обработчики событий от родительских классов, когда ваш объект больше не нужен.

1 голос
/ 13 июля 2011

Поскольку это веб-сервер, я бы создал фиктивный обработчик страниц, который запускает GC.Если память не будет освобождена, подозрение на утечку может быть серьезным.

Впоследствии реальная проблема - , где утечка!

...