ASP .NET Web应用程序内存泄漏 - profiler显示了很多字符串

时间:2018-04-16 06:10:13

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

我的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 =&#34; true&#34;

设置EnableViewState =&#34; false&#34;对于这些控件(我不需要它),字符串不再填满内存

更新1:

设置EnableViewState =&#34; false&#34;在生产中,应用程序池不再符合虚拟内存限制,因此问题解决了!

1 个答案:

答案 0 :(得分: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)