我的 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" 后,应用程序池不再达到虚拟内存限制,所以问题解决了!