2010-05-27 102 views
2

我們有幾個使用ASP.NET和DevExpress ASPxGridView組件的不同項目。在整個這些項目的開發過程中,已經使用了幾種數據綁定技術,現在我們發現其中一些項目正在耗盡服務器上的所有內存。ASP.NET內存管理技術

最初,我們使用一個調用存儲過程並將DataSet綁定到gridview,但是在DX建議中,將其修改爲一個ObjectDataSource並創建了一個對象,最終對該數據庫使用Linq語句並返回一個然後綁定的對象的通用列表。

不幸的是,這並不能解決手頭的問題。我們仍然注意到大量的內存被吃掉了,我正在努力解決這個問題。在運行RedGate內存分析器時,我注意到有很多字符串,RuntimeTypeHandles以及每次我們重新綁定到網格時創建的對象實例。

DataBind在加載頁面時完成,網格在排序時使用回傳,但這會導致MB的內存在每個綁定上泄漏,所以我想知道我可以使用哪些技術/管理對象的最佳做法我們有控制權?我已經在數據對象中實現了IDisposable,處理了linq上下文並將任何其他對象設置爲null,但似乎沒有什麼區別。我似乎是在每次調用時創建一個數據對象的實例,甚至調用dispose也沒有什麼區別。

+0

請描述'泄漏'。這些物體是否還能以某種方式到達?否則,它不是泄漏的情況,而是(太)太多的GC分配和負載。你有沒有簡介'#GC集合'? – 2010-05-27 19:35:26

+0

兆字節?這是一些網格......你正在使用分頁嗎?它應該很容易使用'LinqDataSource' – Thorarin 2010-05-27 19:42:34

+0

您是否遇到內存不足異常或其他類型的內存問題?如果你運行一百次或一千次的頁面,內存是否會最終被覆蓋,或者「壞東西」會發生?換句話說,內存使用真的有害嗎?還是隻是正常?我使用ASPxGridViews並不真的有這個問題。 – Greg 2010-05-27 19:48:58

回答

2

哇,很多管道和移動部件在那裏。

是否可以縮小一點?也就是說,你能剝離頁面上的東西,看看它是如何執行的?

原諒這一點,但是當你說'泄漏記憶'你是什麼意思,你怎麼知道? GC是'懶惰'的,在有壓力之前不會做任何事情。這是一件好事,但它也意味着內存可能會積累,直到需要收集,然後你可能會發現它釋放了很多。由於這個原因,內存輪廓儀通常看起來像鋸齒。

如何存儲網格數據以使分頁工作?我已經看到數據集在viewstate中持續存在,這意味着數據會隨着網格一起發送到客戶端。如果您在回頁面加載時再次查詢,那麼您在那裏浪費了大量空間。

另一個常見問題是事件訂閱會使大對象比他們應該活動的時間更長。實際上,我看到代碼將數據網格放置在會話狀態下,只要會話保持活動狀態。每回發生一次又一次,直到噗噗。在這種情況下,GC無法幫助我們確保物體確實仍然處於「使用中」狀態。

因此,儘量簡化 - 關閉排序,擺脫第三方控制,使用更小的數據集等。使用內存分析器以及讓服務器承受壓力的東西,測量這種情況。如果你發現沒有「泄漏」,那麼開始添加東西,看看它何時出現故障。

+0

由於內存泄漏,我指的是在每個後​​續頁面加載時創建的新對象,其中先前創建的實例尚未清理完畢。我正在使用Redgate Memory Profiler,我加載頁面並將快照作爲基準。然後我打了一個排序,我看到創建了2個新的數據對象實例,因此它顯示了3個活動實例。打另一列進行排序,我得到第四個實例。 我們沒有在會話或視圖狀態中存儲網格,我們只是在頁面加載時綁定到網格。 – Hammerstein 2010-05-29 12:43:47

1

您可能每次都將過多的數據返回到您的iis服務器。請記住,使用標準linq數據源和devexpress網格,每次您對排序或分頁或任何其他回調進行回調時,整個數據都會加載到內存中,然後進行排序和分頁。

這意味着如果您正在加載大量的數據,您將很容易浪費服務器內存。想想你可能有很多用戶打開同一頁面,這會爲每個用戶加載內存中的全部數據,而GC可能沒有足夠的時間來釋放所有這些東西。

DevExpress爲此提供LinqServerModeDataSource,它可以完成數據服務器中的所有分頁和排序。

如果您不能使用它,請嘗試通過過濾來檢索一組較小的數據。

+0

LinqServerModeDataSource雖然需要一個Linq上下文和一個表名,如果我的對象直接從Linq返回IQueryable,這是否允許我使用我的數據?或者我堅持嘗試使用分頁我發送到ObjectDataSource的列表?我們的一些系統上的數據需要以網格顯示,數據量在10萬以上,所以我當然可以理解爲什麼內存正在消失。 – Hammerstein 2010-05-28 11:04:47