Создал сервис с помощью шаблона, сократил код до минимума, и всё равно за несколько минут сервис уже не 4, а 8 мб занимает и продолжает расти. Вот сам код:
protected override void OnStart(string[] args)
{
bool close = false;
bool alreadySend = false;
bool firstExecute = true;
int open_counter = 1;
while (true)
{
if (open_counter >= 2147483643)
open_counter = 1;
ManagementObjectCollection sList = null;
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_USBHub");
sList = searcher.Get();
sList.Dispose();
searcher.Dispose();
open_counter++;
System.Threading.Thread.Sleep(10);
}
}
На неиспользуемые переменные не обращайте внимание, просто я удалил часть кода, где они используются. Может здесь и нет утечек, а память сбросится сама в определенный момент, но я не уверен.
Вот тут
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_USBHub");
Вы создаете обьект.
А вот тут:
searcher.Dispose();
Вы говорите GC, что его можно удалить, а не удаляете его. И делаете это в цикле.
Это же C#, а не С++. Тут за Вас удаляет все сборщик мусора, он сам решит когда пора чистить и, приостановив программу, почистит.
Попробуйте подождать и понаблюдать. Особенно в Visual Studio это хорошо видно. Там прям график есть.
С MSDN:
Этот метод используется для закрытия или освобождения неуправляемых ресурсов, таких как файлы, потоки и дескрипторы, хранящиеся экземпляром класса, реализующего этот интерфейс. Согласно Конвенции этот метод используется для всех задач, связанных с освобождением ресурсов, находящихся в объекте, или подготовкой объекта к повторному использованию.
Об утечке памяти можно говорить только после продолжительного наблюдения и сравнения снэпшотов состояния памяти. Сборщик мусора в CLR достаточно ленив (говоря строгим языком, его поведение недетерменировано), и если у вас на машине достаточно памяти, то собирать мусор он будет редко. Так что запускайте сервис, берите профайлер и делайте снэпшоты каждый час. А потом смотрите, остались ли в живых какие-то объекты, которые по идее должны были уже удалиться, а так же на их количество (наличие некоторого количества таких объектов нормально).
P.S. Ну и да, используйте лучше using:
using (var searcher = new ManagementObjectSearcher("Select * From Win32_USBHub"))
using (var sList = searcher.Get())
{
...
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей