【问题标题】:ASP.Net GridView memory leak with large result set?具有大型结果集的 ASP.Net GridView 内存泄漏?
【发布时间】:2009-11-20 01:35:50
【问题描述】:

我有一个绑定到 ObjectDataSource 的 GridView,它正在调用返回 POCO 的 List 的业务服务对象。

最近,由于客户的要求,我的客户删除了 GridView 上的页面限制编号。这导致 GridView 显示超过 10K 项。

调用此页面时,我们看到 ASP.NET 进程在每次刷新时消耗了大约 30MB 并且不放手。 (最终网络服务器抛出内存不足异常)

我 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="&lt;&lt;" LastPageText="&gt;&gt;" Mode="NumericFirstLast"
        NextPageText="&gt;" PreviousPageText="&lt;"></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>

我已经说服我的客户和客户不要使用这个“功能”,但我仍然很好奇为什么会存在内存泄漏。

【问题讨论】:

    标签: asp.net gridview memory-leaks


    【解决方案1】:

    我怀疑它是 GridView。太多人在使用它;如果它有内存泄漏,其他人会注意到并报告它。

    如果您确定它不在您的 BLL 中,那么就会在两者之间留下胶合逻辑,或者可能是一些外围的但相关的东西。

    您是否使用任何静态引用?

    您是否分配了任何事件处理程序?有一个常见的内存泄漏场景涉及分配事件处理程序,而不是稍后取消分配它们。一个令人不快的极端情况是事件处理程序引用由长生命周期或静态对象持有。

    您是否正在调用所有必需的 Dispose() 调用?是否有任何关联对象使用非托管内存?

    【讨论】:

    • 感谢您的建议。最后我为我的站点地图使用了一个事件处理程序。 (sitemapresolve) 很有趣,因为我遵循了 msdn.microsoft.com/en-us/library/… 的示例,并且该帖子上的社区 cmets 确实提供了帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2017-09-07
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多