Долго работает служба Windows с утечкой памяти?Или просто выглядит как один? - PullRequest
6 голосов
/ 22 августа 2011

Это звучит немного странно, но я не уверен, что у моего процесса есть утечка памяти или нет, и я надеялся получить некоторую информацию.

Недавно мне было поручено расследование того, почему служба Windows в производстве потребляла примерно 1 ГБ памяти (сервер, на котором она работает, имеет 8 ГБ). Это вне моего опыта разработчика, но для меня это был очень хороший шанс прочитать о том, как сборка мусора работает в msdn и других источниках. Но в этот момент я очень озадачен тем, что / когда / сборник действительно запускается, поэтому любая прочитанная мной статья расплывчата.

1) Я нашел специальную операцию, которая увеличивает память на ~ 30 КБ при каждом ее выполнении. 2) Я очень тщательно изучил код и считаю, что я правильно закрываю все и удаляю ссылки. 3) Я использовал несколько профилировщиков памяти, все они, кажется, указывают, что мои старые объекты связаны с gc. 4) Если я оставлю процесс на несколько дней бездействующим, использование памяти внезапно упадет до ~ 8 мегабайт

Итак, исходя из этого, я даже не уверен, что у меня утечка памяти. Учитывая, что GC - дорогостоящий процесс, возможно ли, что я увеличил производство до 1 гигабайта только потому, что еще был свободный баран, и его приобретение было «дешевле», чем запуск GC? Тем более, что этот сервис запускается ~ 6 раз в секунду? Если это так, какие варианты у меня есть? Я понимаю, что я не могу принудительно вызвать GC, есть ли у меня какое-либо средство?

Спасибо за любой ваш вклад, я понимаю, что утечки памяти и gc в csharp - это глубокая тема, и если есть особенно полезное прочтение по этому вопросу, я был бы рад также указать на это.

Ответы [ 2 ]

3 голосов
/ 22 августа 2011

Вы, конечно, МОЖЕТЕ форсировать сборку мусора - просто вызовите GC.Collect. Дело не в том, что вы не можете, а в том, что сборщик мусора обычно лучше определяет, когда он должен работать, чем вы. Но здесь вы можете явно вызвать его - как инструмент отладки - чтобы узнать, подходит ли выделенная память для сбора.

2 голосов
/ 22 августа 2011

Утечка памяти обычно подразумевает, что память никогда не освобождается, и процесс в конечном итоге завершается с OutOfMemoryException .Вы говорите, что через некоторое время он освобождается

4) Если я оставлю процесс на несколько дней бездействующим, использование памяти внезапно упадет до ~ 8 мег

Вы, конечно, можете форсировать сборку мусора, используя GC.Collect .Но, как говорили другие, это не хорошее долгосрочное решение.Я настоятельно рекомендую вам прочитать о сборке мусора в этой книге .Если вы все еще уверены, что у вас есть утечка памяти, вы можете создать дамп процесса в производственной среде, используя Process Explorer .И проанализируем это позже, используя WinDbg .Если вы не можете использовать dotTrace или ANTS при производстве, что будет намного проще.

...