【问题标题】:ASP .NET web application memory leaks - profiler shows a lot of stringsASP .NET Web 应用程序内存泄漏 - 分析器显示大量字符串
【发布时间】:2018-04-23 13:39:07
【问题描述】:

我的 Web 应用程序经常遇到 IIS 对分配给应用程序池的虚拟内存设置的限制。这会导致 IIS 停止应用程序。

我一直在尝试使用 .NET 内存分析器识别我的应用程序中可能存在的内存泄漏,到目前为止,GC 后保留的最大内存量似乎在字符串中。即使访问一页,内存使用量也会增长很多。

当我查看存储的字符串时,我发现重复的字符串,例如 SqlDataSource.SelectCommand 中使用的 SQL 查询

我的网站包含一个母版页,其中有一些用户控件。在其中一个用户控件中,我使用了一个 SqlDataSource,它从数据库中进行简单的选择,如下所示:

<asp:SqlDataSource DataSourceMode="DataSet" CacheDuration="100" ID="myDataSource"
    runat="server" ProviderName="System.Data.Odbc" ConnectionString="<%$ ConnectionStrings:mysql %>"></asp:SqlDataSource>

在控件的 Page_Load 我有:

myDataSource.SelectCommand =
            "SELECT * from table limit 0,10";

我可以找到在内存中重复数百次的相同字符串(可能是每次访问页面时)。

我错过了什么吗?我必须手动处置数据源吗?

谢谢

更新:

事实证明,大量字符串(包括 SQL 查询)保存在内存中,因为我有几个自定义用户控件,显然默认使用 EnableViewState="true"

为这些控件设置 EnableViewState="false" 后(我不需要它)并且字符串不再填满内存

更新 1:

在生产环境中设置 EnableViewState="false" 后,应用程序池不再达到虚拟内存限制,所以问题解决了!

【问题讨论】:

  • 我建议您包含详细的Page_Load 事件代码,因为听起来SqlDataSource 每次页面(重新)加载(即包括回发)时都会从 ODBC 源获取数据。
  • 您是否在某处干扰了页面循环?如果没有,您是否打开任何其他数据库连接?
  • 这是整个 Page_Load,但我认为我在寻找内存泄漏方面走错了路 - 请参阅我的更新
  • Tess、blogs.msdn.microsoft.com/tess/2008/09/09/… 等调试专家已详细记录了它,所以现在您可以发布自己的答案并接受它。

标签: asp.net .net memory-leaks asp.net-customcontrol


【解决方案1】:

事实证明,大量字符串(包括 SQL 查询)保存在内存中,因为我有几个自定义用户控件,显然默认使用 EnableViewState="true"

为这些控件设置 EnableViewState="false" 后(我不需要它)并且字符串不再填满内存

更新 1:

在生产环境中设置 EnableViewState="false" 后,应用程序池不再达到虚拟内存限制,所以问题解决了!

这篇文章深入解释了发生了什么:https://blogs.msdn.microsoft.com/tess/2008/09/09/asp-net-memory-identifying-pages-with-high-viewstate/ (感谢 Lex Li)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多