2009-11-20 36 views
0

我有一個綁定到ObjectDataSource的GridView,該ObjectDataSource調用業務服務對象,該對象返回POCO的列表<>。帶有大型結果集的ASP.Net GridView內存泄漏?

最近,由於客戶的要求,我的客戶端刪除了GridView上的Page Limit編號。這導致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> 

我已經談過我的客戶和客戶了這個「功能」,但我仍然好奇爲什麼內存泄漏存在。

回答

1

我懷疑這是GridView。太多人在使用它;如果它有內存泄漏,其他人會注意並報告它。

如果你確定它不在你的BLL中,那麼這會在兩者之間留下粘合邏輯,或者可能是某種外設,但是相關。

您是否使用任何靜態引用?

您是否分配了任何事件處理程序?有一種常見的內存泄漏情況,涉及分配事件處理程序,而不是稍後取消分配它們。一個令人不快的角落案例是事件處理程序引用由長壽命或靜態對象持有的情況。

您是否撥打了所有必需的Dispose()調用?任何關聯的對象是否使用非託管內存?

+0

感謝您的建議。結束了,我爲我的站點地圖使用了一個事件處理程序。 (sitemapresolve)很有趣,因爲我遵循http://msdn.microsoft.com/en-us/library/system.web.sitemap.sitemapresolve.aspx上的示例,社區對該帖子的評論確實有所幫助。 – itchi 2009-11-21 17:56:22