我有一个绑定到ObjectDataSource的GridView,该ObjectDataSource正在调用一个返回List<>的Business Service对象。 POCO的。
最近,由于客户的要求,我的客户删除了GridView上的页面限制号码。这导致GridView显示超过10K的项目。
当调用此页面时,我们看到ASP.NET进程在每次刷新时大约耗费30MB而不会让它消失。 (最终Web服务器抛出内存不足异常)
我100%肯定这不是BSO(我创建了一个调用BSO 20次并且看不到内存泄漏的页面)。我运行了ANTS Profiler,发现大部分内存确实来自Web UI。
<asp:TextBox ID="uxQuery" runat="server" Width="300px" MaxLength="300"></asp:TextBox>
<asp:Button ID="uxSearch" runat="server" Text="Search" OnClick="uxSearch_Click" />
<asp:GridView ID="GridView1" Width="100%" Visible="True" DataSourceID="MyDataSource"
runat="server" AllowSorting="True" AutoGenerateColumns="False"
OnRowDataBound="GridView1_RowDataBound" EnableViewState="False">
<PagerSettings FirstPageText="<<" LastPageText=">>" Mode="NumericFirstLast"
NextPageText=">" PreviousPageText="<"></PagerSettings>
<Columns>
<asp:TemplateField HeaderText="Name" SortExpression="OrganizationName">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" Text='<%# Eval("Name") %>' CommandName="Name"
CommandArgument='<%# Eval("ID") %>'></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="CityName" HeaderText="City" SortExpression="CityName" />
<asp:BoundField DataField="PhoneNumber" HeaderText="Phone" SortExpression="PhoneNumber" />
</Columns>
<HeaderStyle CssClass="MasterHeader" />
<AlternatingRowStyle CssClass="AlternateRow" />
</asp:GridView>
<asp:ObjectDataSource ID="MyDataSource" runat="server" OldValuesParameterFormatString="original_{0}"
SelectMethod="GetBySearchString" TypeName="BLL.BSO.SummaryBSO"
SortParameterName="sortExpression" EnablePaging="True">
<SelectParameters>
<asp:ControlParameter ControlID="uxQuery" Name="searchString" PropertyName="Text"
Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
我已经谈过我的客户和客户的这个“功能”,但我仍然很好奇为什么存在内存泄漏。
答案 0 :(得分:1)
我怀疑它是GridView。太多人正在使用它;如果它有内存泄漏,其他人会注意到并报告它。
如果你确定它不在你的BLL中,那么它就会留下胶合逻辑,或者可能是外围的,但相关的。
您使用的是静态参考吗?
您是否正在分配任何事件处理程序?存在一种常见的内存泄漏情况,涉及分配事件处理程序,而不是稍后取消分配它们。一个令人不快的角落情况是事件处理程序引用由长寿命或静态对象保存。
您是否正在调用所有必需的Dispose()调用?任何关联的对象是否使用非托管内存?