С# Thread не освобождает память

У меня есть служба Windows, написанная на С#.Net. Когда служба запускается, я создаю новый поток, как показано ниже.

new Thread(new ThreadStart(Function1)).Start();

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

new Thread(new ThreadStart(Function2)).Start();

Этот второй поток выполняет очень простую функцию. Он считывает все строки текстового файла с помощью FileReadAllLines, быстро обрабатывает эту информацию и завершает работу.

Моя проблема в том, что память, используемая вторым потоком, который читает файл, не собирается. Я позволю своему сервису работать в течение 3 часов, надеясь, что GC будет вызван, но ничего не произошло, и диспетчер задач все еще показывает, что моя служба использует 150 МБ памяти. Функция чтения и обработки текстового файла очень проста, и я уверен, что нет скрытых ссылок на строковый массив, содержащий текст. Может ли кто-то пролить свет на то, почему это происходит? Возможно ли, что поток, порожденный другим порожденным потоком, не сможет очистить после себя?

Спасибо

2 ответа

Если вы используете диспетчер задач Windows, чтобы попытаться выработать используемую память, вы, вероятно, обманете вас. Память, используемая CLR, обычно не возвращается в операционную систему, насколько мне известно... поэтому вы потенциально все еще видите высокий рабочий набор, хотя большая часть этой памяти по-прежнему доступна для повторного использования внутри процесс.

Если вы позволите службе работать в течение недели, вы видите, что использование памяти постоянно растет через неделю, или оно просто увеличивается в первый день, а затем на плато? Если это так, вы определенно рассматриваете это как проблему? Если это так, вам может потребоваться выполнить вторую задачу в отдельном процессе.


Доверяйте сборщику мусора и перестаньте беспокоиться. 150 мегабайт - ничто. Вы даже не измеряете размер файла; большинство из них будет кодом.

Если вас беспокоит, куда идет память, начните с понимания того, как память работает в современной операционной системе. Вам нужно понять разницу между виртуальной и физической памятью, разницей между выделенной и выделенной памятью и всем этим, прежде чем вы начнете метать числа, например "150 мегабайт выделенной памяти". Помните, что у вас есть 2000 мегабайт виртуального адресного пространства в 32-битном процессе; Я бы не подумал, что 150-миллионный процесс велик.

Как говорит Джон, вы должны беспокоиться о медленном росте частных байтов. Если этого не происходит, тогда у вас нет утечки памяти. Пусть сборщик мусора выполняет свою работу и не беспокоится об этом.

Если вы все еще беспокоитесь об этом, то хорошие небеса не используют диспетчер задач. Получите профайлер памяти и узнайте, как его использовать. Диспетчер задач предназначен для проверки процессов, глядя на них с высоты 30000 футов. Вам нужно использовать микроскоп, а не телескоп, чтобы проанализировать, как процесс освобождает байты одного файла.

licensed under cc by-sa 3.0 with attribution.