2010-05-13 18 views
0

我們正在調試一些內存問題。我們正在觀看同一個應用的5個實例。我們停止了3.Gen2堆大小從大約5M變爲大約10M,並且Gen0和Gen1堆大小變化不明顯。關閉一些應用程序的實例,增加Gen-2垃圾收集堆?

這與我所期望的完全相反。我預計它會縮小規模,並且永遠不會期望它會增加。

這是怎麼回事?

更多詳細信息: 這些是控制檯應用程序,相同的物理.exe,不同的命令行,都做簡單的「讀取文件,插入數據庫」(反之亦然)的工作。

我們遇到內存問題,無法找到它,因此在絕望中每次批處理後都添加一個GC.Collect。這樣做緩解了內存使用情況,但沒有提供根本問題的線索。

@ S.Skov,GC堆大小對於每個實例都是相同的。關閉一些應用程序時,每個仍然打開的應用程序具有相同的堆大小。這使我們在假設GC在同一計劃的所有實例之間共享的情況下運營。我們使用sysinternals的Process Explorer來測量堆大小。

tl; dr版本:內存使用失控。 GC.Collect()「修復」症狀,但不是問題。此外,GC堆大小在同一應用的所有實例中始終保持一致。

道歉:我也可能做一個糟糕的工作,有效地轉錄我們的團隊的討論和揮手,在網絡上有意義的東西。

+0

絕對需要更多的細節。爲什麼五個實例應該足夠像GC,堆等是按每個進程定義的。 gen2堆何時更改大小?你想要調試什麼問題? 5-10M的堆大小非常小,可能是由於在WinForm上移動鼠標光標引起的。 – 2010-05-13 14:06:32

+0

什麼樣的應用程序? 「實例」是一個過程嗎?你用什麼來衡量發電量? – 2010-05-13 14:13:49

+0

細節補充,如果我不能讓我的問題變得有意義,我也願意使它成爲CW。 – hometoast 2010-05-13 14:47:54

回答

1

你確定你真的有內存問題 - 即你遇到內存不足錯誤或其他'漏'的東西嗎?

如果GC.Collect()修復了內存問題,那麼你沒有問題。垃圾收集只在需要時纔會發生。通常這意味着Gen0和Gen1會被收集很多(因爲這些區域與Gen2和LOH相比很小),但Gen2和LOH幾乎不會被GCed,除非你強制它或系統壓力的應用程序。 根據你正在分配的內容,你可能會看到一些完整的垃圾收集運行,這些垃圾收集運行可以壓縮不同的代堆區域,但不會真正釋放任何內存。

通過設計,.NET應用程序會吞噬所有可以讓它變得油膩的手的內存,只有當系統告訴它停止並釋放一些內存時,它纔會這樣做。