Это звучит немного странно, но я не уверен, что у моего процесса есть утечка памяти или нет, и я надеялся получить некоторую информацию.
Недавно мне было поручено расследование того, почему служба Windows в производстве потребляла примерно 1 ГБ памяти (сервер, на котором она работает, имеет 8 ГБ). Это вне моего опыта разработчика, но для меня это был очень хороший шанс прочитать о том, как сборка мусора работает в msdn и других источниках. Но в этот момент я очень озадачен тем, что / когда / сборник действительно запускается, поэтому любая прочитанная мной статья расплывчата.
1) Я нашел специальную операцию, которая увеличивает память на ~ 30 КБ при каждом ее выполнении.
2) Я очень тщательно изучил код и считаю, что я правильно закрываю все и удаляю ссылки.
3) Я использовал несколько профилировщиков памяти, все они, кажется, указывают, что мои старые объекты связаны с gc.
4) Если я оставлю процесс на несколько дней бездействующим, использование памяти внезапно упадет до ~ 8 мегабайт
Итак, исходя из этого, я даже не уверен, что у меня утечка памяти. Учитывая, что GC - дорогостоящий процесс, возможно ли, что я увеличил производство до 1 гигабайта только потому, что еще был свободный баран, и его приобретение было «дешевле», чем запуск GC? Тем более, что этот сервис запускается ~ 6 раз в секунду? Если это так, какие варианты у меня есть? Я понимаю, что я не могу принудительно вызвать GC, есть ли у меня какое-либо средство?
Спасибо за любой ваш вклад, я понимаю, что утечки памяти и gc в csharp - это глубокая тема, и если есть особенно полезное прочтение по этому вопросу, я был бы рад также указать на это.