IIS System.OutOfMemoryException问题Web服务

时间:2018-03-31 17:35:11

标签: c# asp.net web-services iis

我们有一个

的Asp.Net Web服务
  

System.OutOfMemoryException:抛出了类型'System.OutOfMemoryException'的异常。 System.Threading.Thread.Start()

中的System.Threading.Thread.StartInternal(IPrincipal principal,StackCrawlMark& stackMark)

我们正在刷新应用程序池作为临时修复。问题似乎每4-5小时重新出现一次。 Web Service基本上从SQL Server DB返回存储过程中的数据。这是遗留应用程序多年来没有做过任何代码更改。一个稳定多年的应用程序是否有可能突然出现任何内存泄漏问题?

1 个答案:

答案 0 :(得分:1)

您将需要分析IIS应用程序池的内存转储以解决此问题。我过去也做过同样的事情,一旦你对这些工具感到满意,就不会太难了。

  1. WinDbg - https://go.microsoft.com/fwlink/p/?LinkId=536682 - 确保 您只能安装Windows组件调试工具 链接到完整的SDK
  2. Windows符号服务器 - 的 SRV C:\符号 https://msdl.microsoft.com/download/symbols 即可。内 在WinDbg文件菜单中,选择符号文件路径并添加此路径(您可以 更改c:\ symbols的位置,但确保目录存在和 是进行调试工作的系统的本地方法。)
  3. SOS WinDbg扩展 - C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ SOS.dll。将此DLL复制到Windows目录的调试工具
  4. 安装完工具后,需要进行内存转储并进行分析。

    • 通过任务管理器获取应用程序的内存转储。确保使用与应用程序相同的位任务管理器,即如果IIS应用程序池以64位运行,则使用64位的任务管理器实例。
    • 使用适当的32/64位版本的WinDbg,然后通过WinDbg中的文件菜单打开内存转储。
    • 加载内存转储后,使用此命令加载sos: .loadby sos clr
    • 有许多有用的sos命令可用于故障排除,但我们对内存问题感兴趣的那个命令就是这个:!dumpheap -stat 。这将为您提供所有当前加载的类型以及它们使用的内存量。
    • 您可能还想确认它不是线程争用问题。可以提供帮助的命令是:!sos.syncblk 以查看是否有任何线程被阻止并且!runaway 以查看是否有任何线程已经运行了过多的线程时间。这两种情况都可能导致应用程序无响应,并通过 IISRESET 或回收来修复。

    同样,WinDbg有一点学习曲线但是一旦你克服了这个问题,就可以很容易地快速诊断出这些问题。