2011-10-04 18 views
0

背景: 我有一個2類A & B.類A包含1個int64,1個int,1個日期時間,6個字符串,1個字節[]和一個B類對象列表。包含許多字符串變量導致內存問題的類

B類包含2個Int64,1個枚舉(4個值),5個字符串。

A類和B類之間有一個主要的細節關係。 A類可以在其列表中有0個或更多的B類對象。

這些對象用於存儲我們的數據庫的搜索結果。

我們有一個SOA架構。客戶可以使用特定的日期範圍和固定的標準進行搜索。我們使用這些服務來收集搜索結果並分批推送給客戶端。發送每批後,我們從服務中刪除這些對象。

問題: 如果用戶執行返回200k結果的搜索(組合A + B類計數),則服務內存消耗跳轉200mb。但是,如果後續搜索只返回少量結果,則內存不會恢復到之前的狀態。當我查看服務的性能計數器時,我發現很多內存都被gen2對象佔用。

沒有嘗試做一個GC.Collect(),我怎樣才能確保該內存更快地返回?我雖然在A類和B類上使用IDisposable接口,但由於它們中的大多數字段都是字符串,我不知道如何強制處理它們。

回答

7

您可能想考慮從另一個角度來攻擊問題。與其試圖優化垃圾收集細節等低級別的東西,爲什麼不退後一步,問你是否真的需要一次返回200k結果?

如果這被顯示在UI然後顯示200K的結果是完全沒用的,一個人因爲這是公正的方式太多的數據。我建議做一些分頁,一次只顯示100個(每次只能從服務中檢索100個)。或者可能向用戶顯示前100個,然後讓他們點擊一個按鈕,如果他們真的想要檢索所有200k。

的改進一樣,將會有比微優化內存管理更大的影響。

+1

完全同意 - 用戶不需要200k行數據 – Matt

2

即使你收集垃圾,我不會認爲過程將內存返回到操作系統。上次我看,CLR採取了這樣的方法,如果你曾經使用過那麼多的內存,你可能會在稍後再次需要它。

在最現代化的機器,200MB是不是真的那麼多 - 這絕對是一個真正的問題,或更值得關注的?

相關問題