【问题标题】:IIS System.OutOfMemoryException issue Web serviceIIS System.OutOfMemoryException 问题 Web 服务
【发布时间】:2018-09-10 10:46:26
【问题描述】:

我们有一个具有

的 Asp.Net Web 服务

System.OutOfMemoryException:引发了“System.OutOfMemoryException”类型的异常。在 System.Threading.Thread.StartInternal(IPrincipal principal, StackCrawlMark& stackMark)     在 System.Threading.Thread.Start()

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

【问题讨论】:

  • 我没想到......你改变了 IIS 配置中的任何内容吗?例如您是否将应用程序分配到另一个应用程序池?您是否勾选了每 X 分钟一次的回收池选项?

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


【解决方案1】:

您将需要分析 IIS 应用程序池的内存转储来解决此问题。我过去也做过同样的事情,一旦你熟悉了这些工具,这并不难。

  1. WinDbg - https://go.microsoft.com/fwlink/p/?LinkId=536682 - 确保 您只安装 Windows 调试工具组件,因为 完整 SDK 的链接
  2. Windows 符号服务器 - srvc:\symbolshttps://msdl.microsoft.com/download/symbols。之内 WinDbg File 菜单,选择 Symbol File Path 并添加这个路径(你可以 更改 c:\symbols 的位置,但确保目录存在并且 是执行调试工作的系统本地的)。
  3. SOS WinDbg 扩展 - C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll。将此 DLL 复制到 Windows 调试工具目录

安装工具后,您需要获取内存转储并对其进行分析。

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

同样,WinDbg 有一些学习曲线,但一旦克服了这个困难,就可以非常容易地快速诊断出此类问题。

【讨论】:

  • 谢谢,这绝对有帮助。我们有本机内存泄漏。但我找不到问题的根本原因
  • 乐于帮助@Gopinath。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多