.NET Windows Service, потоки и сборка мусора (возможные утечки памяти) - PullRequest
2 голосов
/ 09 апреля 2010

Я занимаюсь разработкой службы .NET Windows, которая создает пару потоков, а затем использует эти потоки для отправки заданий на печать на принтеры (для каждого принтера есть поток). У меня есть некоторые проблемы, которые иногда могут быть исправлены путем перезапуска службы. Некоторые проблемы также возникают, когда служба работает некоторое время. Это заставляет меня подозревать возможную утечку памяти. Итак, пара вопросов:

Будет ли сборщик мусора собирать объект, если он был создан внутри потока, или объект будет существовать до тех пор, пока поток не будет остановлен / завершен?

Какие инструменты можно использовать для контроля объема памяти, используемого службой Windows и потоком, который я запускаю программно?

Ответы [ 3 ]

3 голосов
/ 09 апреля 2010

Все объекты создаются внутри потоков. Каждая когда-либо выполненная инструкция находится в потоке. Объекты будут собираться мусором в какой-то момент после того, как на них не будет живых ссылок. Объекты не «принадлежат» потоку, в котором они были созданы.

Для мониторинга службы вы можете использовать perfmon, который имеет множество счетчиков для таких вещей, как сборка мусора. Для более подробного анализа того, где вы можете просачиваться, вы должны использовать профилировщик. Все это, вероятно, будет упрощено, если ваша программа может также работать как не-сервис. (Вы можете разделить его на часть «запуска», а затем на библиотеку, которую можно использовать либо из службы, либо из консольного приложения.)

1 голос
/ 09 апреля 2010
0 голосов
/ 10 апреля 2010

Сборщик мусора .NET освобождает память, удерживаемую объектами, которые больше не «достижимы». Чтобы выяснить, какие объекты являются «достижимыми» (и, следовательно, еще не пригодными для сбора мусора), GC приостанавливает все потоки, начинает с набора «корневых» объектов и пытается пройти полный график. Каждый объект, который не помечен как достижимый, становится кандидатом на сборку мусора. Не имеет значения, какой поток был активным, когда память была первоначально выделена; все, что имеет значение, - то, что ваш объект больше не доступен во время первой фазы сборки мусора. «Корни» включают все локальные переменные и параметры метода (это переменные в стеке для каждого из потоков вашей службы) и статические переменные.

Microsoft имеет бесплатную загрузку под названием Средства отладки для Windows, которая включает в себя windbg.exe. Этот инструмент можно использовать для создания дампа памяти (приватной) вашего процесса. Вы можете вызвать его так: windbg.exe -p <processID>

Инструмент (с помощью расширения SOS) позволяет самостоятельно перемещаться по достижимым объектам. Если ваша проблема заключается в избытке доступных управляемых объектов, инструмент должен помочь.

...