Web服务内存泄漏的原因

时间:2008-11-12 21:08:18

标签: c# web-services .net-3.5 memory-leaks

我们有一个Web服务,它会占用越来越多的私有字节,直到该应用程序停止响应。托管堆(主要是Gen2)将显示大约200-250 MB,而专用字节显示超过1GB。在托管堆之外发生内存泄漏的可能原因是什么?

我已经检查了以下内容:

  1. 多产的动态程序集(Xml序列化,正则表达式等)
  2. 会话状态(已关闭)
  3. System.Policy.Evidence内存泄漏(已安装SP1)
  4. 线程死锁(不使用Join,只锁定)
  5. 使用SQLOLEDB(使用SqlClient)
  6. 我可以查看哪些其他来源?

6 个答案:

答案 0 :(得分:2)

确保您的应用符合发布模式。如果在调试模式下编译并部署它,只需实例化一个定义了事件的类(甚至不需要引发事件),就会导致一小段内存泄漏。在足够长的时间内实例化足够的这些对象将导致使用所有内存。我已经看到网络应用程序会在几个小时内耗尽所有内存,仅仅因为使用了调试版本。立即编译为发布版本并永久修复问题。

答案 1 :(得分:0)

同时寻找:

  • 正在加载的COM程序集
  • 未关闭数据库连接
  • 缓存&州(会议,申请)

尝试强制垃圾收集器(GC)运行(编写一个在加载时执行此操作的页面)或尝试使用检测,但这在我的体验中有点受欢迎。另一件事是让它继续运行,看它是否内存不足。

可能发生的事情是内存充足,Windows无法通知您的应用程序进行清理。这会导致应用程序看起来像使用越来越多的内存,因为它可以,实际上系统可以在需要时回收内存。 SQL Server和Exchange做了很多。这个想法是为什么当有足够的资源时会导致不必要的清理。

罗布

答案 2 :(得分:0)

我建议你在不同的时间查看堆栈的快照,看看是什么耗尽了内存。如果你的应用程序使用的是Java,那么jmap的效果非常好 - 你只需给它一个java进程的PID。

如果使用其他内容,请尝试使用Lambda Probe(http://www.lambdaprobe.org/d/index.htm)。它没有显示太多细节,但至少会向你显示内存使用情况。

我的JDBC代码中有一个糟糕的内存泄漏,几年前我最终被追溯到JDBC规范的变化,我错过了(关于结束语句等)。它采用了Lamdba Probe和jmap的组合,将问题本地化,足以解决问题。

干杯,

-R

答案 3 :(得分:0)

在由于缺少可用内存而拒绝内存请求之前,垃圾收集不会运行。当一个人不在时,这通常会使事情看起来像是内存泄漏。

您是否在服务中有任何活动和事件处理程序?服务通常具有静态变量,如果要从静态实例创建事件处理程序,连接到非静态实例对象,静态将永久保存对实例的引用,这将阻止它释放。

答案 4 :(得分:0)

仔细检查未启用跟踪。我已经看到跟踪实例慢慢消耗内存,直到应用程序达到它的应用程序池限制。

答案 5 :(得分:0)

对于它的价值,我的问题不在于服务,而在于调用它的HttpClient。

客户端处理不当,因此保持打开连接并锁定内存。

处置客户端后,服务将按预期释放内存。