Утечка памяти при отправке электронной почты - PullRequest
1 голос
/ 25 января 2010

У меня есть служба Windows, которая настроена на отправку писем по заранее заданному расписанию. Расписание работает с System.Timers.Timer, и каждый раз, когда Timer_Elapsed повышается, я вызываю Timer.Stop (), отправляю электронные письма (каждый раз около 1500 электронных писем), вычисляю количество времени, когда будет поднят следующий тик, и запускаю таймер ( вызов метода Timer.Start ()). Проблема в том, что, когда таймер истек и процесс начал посылать электронные письма, используемая память увеличивается, но не уменьшается после завершения. Когда я вызываю функцию в «не синхронизированном» приложении, используемая память освобождается после завершения процесса отправки. Кто-нибудь может помочь мне понять, почему это происходит? Может быть, что-то касается потоков, используемых в таймере?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 25 января 2010

Здесь есть несколько очевидных возможностей.

  1. Сборка мусора не запущена и утечка памяти отсутствует. Мониторинг с течением времени, чтобы увидеть, насколько динамично используется память и посмотреть, достигнет ли она максимума и установится.

  2. Вы не используете функции закрытия или сброса библиотеки

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

Утечки памяти, хотя и не возможны никакими средствами, маловероятны на языках .net. Вы не имеете прямого доступа к памяти или не контролируете ее. Поскольку JIT выполняет выделение и очистку памяти, все, что вам действительно нужно проверить, - это вещи, которые не освобождаются в коде.

Без подробностей я не могу дать лучшую помощь, особенно не зная, делаете ли вы IO файла и т. Д.

0 голосов
/ 26 января 2010

Необходимо закрыть соединение объекта SMTPClient, чтобы предотвратить утечки памяти.

SmtpClient client = new SmtpClient ("SMTPServerAddress"); ... client.Send (сообщение); client.ServicePoint.CloseConnectionGroup (client.ServicePoint.ConnectionName);

...