Как контролировать объем памяти постоянно работающей службы Windows? - PullRequest
0 голосов
/ 18 марта 2010

Я создал службу Windows, которая постоянно опрашивает базу данных. Для этого у меня есть таймер на месте. Каждый раз, когда я запрашиваю таблицу базы данных, я открываю соединение и закрываю его сразу же после завершения моей работы. Сейчас я делаю это каждые 20 секунд для тестирования, но позже это время может увеличиться до 5-10 минут.

При каждом опросе таблицы базы данных увеличивается объем памяти работающей службы на 10-12 КБ. Это я вижу в диспетчере задач. Есть ли способ контролировать это.

Ответы [ 3 ]

1 голос
/ 18 марта 2010

Сборщик мусора должен со временем включиться и освободить память. Это не основано на времени, а скорее на памяти. Таким образом, вы должны иметь возможность моделировать более длительные периоды, просто увеличивая частоту вашего опроса. Если GC не восстанавливает память, значит, где-то есть утечка. Также не забывайте, что соединения с базой данных, как правило, используют пул соединений, что означает, что даже если вы закончили с соединением, пул активных соединений все еще ждет.

Но это нормально, когда память не восстанавливается мгновенно. Не поддавайтесь желанию использовать GC.Collect, если только он не предназначен для отладки. Это может повлиять на эффективность работы сборщика мусора.

0 голосов
/ 18 марта 2010

Проверьте, нет ли утечки памяти. Для этого я использую Windbg, как описано в Утечка памяти в CLR :

  • !dumpheap -stat для просмотра статистики каждого типа
  • !dumpheap -type <LeakedTypeName> чтобы увидеть экземпляры предполагаемого типа утечки
  • !gcroot <AddressOfObject> для отслеживания задания, связывающего распределение (т. Е. Причину утечки).
0 голосов
/ 18 марта 2010

Память приложения .NET управляется CLR, и не рекомендуется вмешиваться в него. Вместо этого я бы посоветовал вам профилировать свой сервис и попытаться понять, почему у него течет память.

Что вы делаете с результатами запроса? Вы храните их в памяти (некоторые статические объекты)?

Убедитесь, что вы используете using блоки вокруг одноразовых ресурсов, таких как SqlConnection и SqlCommand.

Сборщик мусора должен позаботиться об освобождении ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...