发送电子邮件时内存泄漏

Posted

技术标签:

【中文标题】发送电子邮件时内存泄漏【英文标题】:Memory leak while sending email 【发布时间】:2011-01-08 23:48:13 【问题描述】:

我有一个 Windows 服务,它被配置为按照预定义的时间表发送电子邮件。该计划与 System.Timers.Timer 一起使用,每次 Timer_Elapsed 被引发时,我都会调用 Timer.Stop(),发送电子邮件(每次大约 1500 封电子邮件),计算下一个滴答声将被引发的时间量并启动计时器(调用 Timer.Start() 方法)。 问题是当计时器结束并且进程开始发送电子邮件时,正在使用的内存增加但在完成后不会减少。当我在“非定时”应用程序中调用该函数时,已使用的内存在完成发送过程后被释放。 谁能帮我理解为什么会这样?也许与计时器中使用的线程有关?

提前致谢。

【问题讨论】:

【参考方案1】:

这里有一些明显的可能性。

    垃圾收集没有启动,也没有内存泄漏。随着时间的推移监控内存使用情况,看看它是否达到峰值和稳定。

    您没有使用库的关闭或刷新功能

    您的计时器正在启动一个永不终止的线程。使用进程监视器并观察线程数很容易看到这一点。

内存泄漏虽然并非不可能,但在 .net 语言中是不可能的。您不是直接访问或控制内存。由于 JIT 会进行内存分配和清除,因此您真正需要检查的是代码中没有释放的东西。

没有细节我无法提供更好的帮助,尤其是不知道你是否在做文件 IO 等。

【讨论】:

我几乎可以肯定,发送电子邮件的代码片段在完成后没有任何未使用的引用或未关闭的连接。我已将 MailMessage 置于 using 范围内,因此我认为释放了唯一的一次性和非托管资源。关于线程数,我不确定,现在正在检查。 我支持线程的想法,也许你正在无意中创建一个新环境,因为计时器的 ontick() 或者你有什么。此外,垃圾收集很奇怪。请务必在两次以上的睡眠/电子邮件/睡眠迭代中测量内存使用情况,它可能会“缓存”电子邮件实用程序。 我也是这么想的,它可能会缓存一些资源以供电子邮件和重用。我已经测量了睡眠/电子邮件/睡眠的多次迭代,当每次迭代中内存增加时,这非常令人惊讶。雅各布,我计算过线程数,它会增加,完成后会减少,但数量不会相同。当时是 11,在此过程中增加到 17 并减少到 14。奇怪的事情正在发生......【参考方案2】:

您必须关闭 SMTPClient 对象连接以防止内存泄漏。

SmtpClient 客户端 = new SmtpClient("SMTPServerAddress"); ... 客户端.发送(消息); client.ServicePoint.CloseConnectionGroup(client.ServicePoint.ConnectionName);

【讨论】:

以上是关于发送电子邮件时内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - MessageUI 框架中的泄漏?

在磁盘或 RAM 不足时发送电子邮件警报

干货分享系列 - IPC摄像头在线状态ping检测与告警邮件发送项目总结

如何使用 SmtpClient.SendAsync 发送带有附件的电子邮件?

使用 Socket.IO + Node.js + ZMQ 发送消息时发生内存泄漏

Javascript内存和泄漏问题