Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET中检测内存泄漏_C#_Asp.net_Telerik_Iis 7.5 - Fatal编程技术网

C# 在ASP.NET中检测内存泄漏

C# 在ASP.NET中检测内存泄漏,c#,asp.net,telerik,iis-7.5,C#,Asp.net,Telerik,Iis 7.5,我的开发团队现在正在使用ASP.NET 3.5/4.0,我们的网站正在IIS 7.5上运行。最近,我们遇到了一些问题(大约每周一次),导致ASP.NET应用程序中抛出内存不足异常。“解决方案”是在我们的网站上重新启动应用程序池。我说“解决方案”,因为它几乎不是一个解决方案;这更像是一条绷带,它只是让我们的应用程序池保持在合理的状态下运行。在我看来,某些应用程序或许多应用程序正在泄漏内存,随着时间的推移,内存正在累积,并导致内存不足异常。虽然我可以将IIS设置为定期重新启动应用程序池,但我更希望知

我的开发团队现在正在使用ASP.NET 3.5/4.0,我们的网站正在IIS 7.5上运行。最近,我们遇到了一些问题(大约每周一次),导致ASP.NET应用程序中抛出内存不足异常。“解决方案”是在我们的网站上重新启动应用程序池。我说“解决方案”,因为它几乎不是一个解决方案;这更像是一条绷带,它只是让我们的应用程序池保持在合理的状态下运行。在我看来,某些应用程序或许多应用程序正在泄漏内存,随着时间的推移,内存正在累积,并导致内存不足异常。虽然我可以将IIS设置为定期重新启动应用程序池,但我更希望知道如何检测内存泄漏,以便尝试修复程序,而不是继续应用创可贴。是否有任何工具可以检测和记录ASP.NET应用程序的内存泄漏

此外,当我们转向使用Telerik的RAD控制时,我们真的开始看到更多的问题。有没有其他人在使用这些控件时遇到过类似的问题

谢谢


Aaron

有很多内存分析器


一个流行的是,另一个是,两者都是商业产品。

您可以在不购买第三方工具的情况下降低到非常低的级别。但这不是为胆小的人准备的


我之前发布本指南是为了回答另一个问题,但该问题和我的答案似乎已被删除。这不是为胆小的人准备的:

  • 在服务器上安装Windows调试工具(作为的一部分提供)
  • 应用程序运行一段时间后,使用adplus捕获进程的内存转储(使用诸如process Explorer之类的工具查找要转储的正确进程ID非常有用):

    ADPLUS-hang-p-o.

  • 这将创建一个包含内存转储的目录。您现在可以使用windbg,并打开转储文件(文件->打开崩溃转储…)

  • 非托管代码的乐趣现在出现了。但是,您可以使用一种叫做Strike之子的东西来查看分配了哪些对象,它可以理解.NET代码。首先加载SOS:

    .loadby sos mscorwks

  • 然后让它检查托管堆:

    !dumpheap -stat
    
    这通常会产生大量的输出,但有两列按类型显示实例的数量和所消耗的内存量。您希望看到很多类型(例如字符串),但如果您自己的类型有数千个实例,您可能会以某种方式泄漏这些对象。在过去,我注意到的一个问题是将对象中的事件处理程序连接到应用程序中的静态事件-然后该事件会对这些对象中的每一个进行实时引用

    我永远也记不起这其中的大部分是如何工作的,通常指的是这个

    Tess Ferrandez有一个示例,它有时涉及使用非托管调试器进行.NET调试



    例如,如果将
    XmlSerializer
    s与非默认构造函数一起使用,则详细说明潜在问题。

    ASP.Net内存泄漏将限于任何持续存在的问题。应用程序状态,以及在较小程度上的会话状态

    首先要检查在这些区域内工作的任何东西


    此外,任何类中的静态对象,尤其是列表或任何类似的对象。

    您也可以尝试使用asp.net。它是一个免费工具,允许您在应用程序运行时查看存储在内存中的信息


    这允许您分析asp.net缓存,查看应用程序状态的所有当前会话和内容。

    是否从应用程序调用任何非托管代码?如果是这样的话,我会开始看那里。这个问题不应该结束。它提出了一个简单的问题:“是否有任何工具可以检测和记录ASP.NET应用程序的内存泄漏?”。这绝对是一个有效的问题,可以在SO格式内回答。谢谢!我最终使用了这种方法。这无疑为我指明了正确的方向。非常感谢,这对我帮助很大。此外,对于我这样的人来说,我必须使用这两个答案才能获得内存。DotTrace是为了性能,但同一页面上有指向dotmemory的链接,这对检测内存泄漏非常有帮助。ANTS profiler易于使用,在红门网站上有一个很棒的漫游,它不仅清楚地解释了如何使用它,而且还包含了很多有用的信息。几年前,我和另一位开发人员在一个大型web表单项目中成功地使用了它。