代码之家  ›  专栏  ›  技术社区  ›  itchi

具有大结果集的ASP.NET网格视图内存泄漏?

  •  0
  • itchi  · 技术社区  · 15 年前

    我有一个GridView绑定到一个ObjectDatasource,它调用一个Business Service对象,该对象返回poco的列表。

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

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

    我百分之百肯定这不是BSO(我创建了一个调用BSO 20次的页面,没有发现内存泄漏)。我运行了AntsProfiler,发现大部分内存确实来自Web用户界面。

    <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>
    

    我已经和我的客户谈过这个“特性”,但我仍然好奇为什么内存泄漏存在。

    1 回复  |  直到 15 年前
        1
  •  1
  •   RickNZ    15 年前

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

    如果您确定它不在您的BLL中,那么这将使粘合逻辑处于中间,或者可能是一些外围的,但相关的东西。

    是否使用任何静态引用?

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

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

    推荐文章