【问题标题】:Causes for web service memory leakWeb服务内存泄漏的原因
【发布时间】:2010-09-22 01:45:07
【问题描述】:

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

我已经检查了以下内容:

  1. 多产的动态程序集(Xml 序列化、正则表达式等)
  2. 会话状态(关闭)
  3. System.Policy.Evidence 内存泄漏(已安装 SP1)
  4. 线程死锁(不使用 Join,只使用锁)
  5. 使用 SQLOLEDB(使用 SqlClient)

我可以检查哪些其他来源?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 你有链接或任何文件吗?我从来没有听说过这样的问题,但如果它是真的,我公司的应用程序有一些大问题:)
    • 有关此问题的更多信息,请参见以下链接。 kbalertz.com/919481/…
    • 这个 bug 很有趣,但有两个条件我认为不适用于这个案例: 1) VB - 他标记了他的帖子 c#,并且这个 bug 特别提到了 VB。 2)在视觉工作室内运行。无论调试模式如何,任何“已部署”的应用都不会在 VS 中运行。
    • 它没有明确说明您必须在 VS 中运行它的一种或另一种方式。根据个人经验,我可以证明这种情况会发生,无论您是从 VS.Net 运行应用程序还是以其他方式运行它。即使它作为 Web 应用程序运行并在完全不同的机器上运行。
    • 你说得对,它只是 VB.Net。我有点认为这是 .net 框架中的一个错误,因为我认为它们都编译为 MSIL。
    【解决方案2】:

    我建议您在不同时间查看堆栈的快照,看看是什么占用了内存。如果您的应用程序使用 Java,那么 jmap 工作得非常好 - 您只需为其提供 java 进程的 PID。

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

    我的 JDBC 代码中存在严重的内存泄漏,最终被追踪到几年前我错过的 JDBC 规范更改(关于关闭语句等)。它结合了 Lamdba Probe 和 jmap 来定位问题,足以解决它。

    干杯,

    -R

    【讨论】:

      【解决方案3】:

      同时寻找:

      • 正在加载 COM 程序集
      • 数据库连接未关闭
      • 缓存和状态(会话、应用程序)

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

      可能发生的情况是内存充足,而 Windows 没有向您的应用发出清理信号。这导致应用程序看起来使用越来越多的内存,因为它可以,而实际上系统可以在需要时回收内存。 SQL Server 和 Exchange 经常这样做。这个想法是为什么在有大量资源时导致不必要的清理。

      罗伯

      【讨论】:

        【解决方案4】:

        在内存请求因可用内存不足而被拒绝之前,垃圾收集不会运行。当有人不在时,这通常会使事情看起来像是内存泄漏。

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

        【讨论】:

          【解决方案5】:

          仔细检查是否未启用跟踪。我已经看到跟踪实例缓慢消耗内存,直到应用达到其应用池限制。

          【讨论】:

            【解决方案6】:

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

            客户端没有正确处理,所以它保持连接打开并锁定内存。

            在处理完客户端后,服务按预期释放了内存。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-08
              • 1970-01-01
              • 1970-01-01
              • 2011-06-30
              • 2011-01-14
              • 2021-09-16
              相关资源
              最近更新 更多