我有一個奇怪的情況,我想弄明白。觸發gen2垃圾回收的是什麼?
創世紀:
我運行我的程序在物理機上用核心和RAM 128GB。我試圖確定爲什麼它沒有使用所有可用的內核,通常它平均使用20-25%的CPU(因此16個內核中有4-5個內核)。當我查看性能計數器時,他們顯示的是60-70%的垃圾收集時間。
僅供參考,我使用.NET Framework 4和TPL(Parallel.ForEach)來編程我的程序的性能密集型部分。我將線程數量限制爲內核數量。
問題:
我創建了大量的對象,太多的垃圾收集器有效地處理,因此它在垃圾收集花費了大量的時間。
的簡單的解決方案到目前爲止:
我介紹對象池以減少對垃圾收集器中的壓力。我將繼續合併對象以提高性能,已經合併一些對象將垃圾收集時間從60-70%減少到45%,並且我的程序運行速度提高了40%。
揮之不去的問題(一個我希望你能爲我解答):在可用的RAM最14GB運行時使用,相比之下,RAM 128GB,這是相當小
我的程序。這臺機器上沒有別的東西在運行(它對我來說純粹是一個測試臺),並且有很多可用的RAM。
- 如果有足夠的內存可用,爲什麼gen2(或全部)集合都會發生?相當大數量的這些gen2集合(成千上萬)正在發生。即如何確定啓動gen2集合的閾值?
- 爲什麼垃圾收集器不會延遲任何完整收集,直到物理RAM上的壓力達到較高閾值爲止?
- 有沒有什麼辦法可以配置垃圾收集器來等待更高的閾值? (即不打擾可言,如果沒有必要收集)
編輯:我已經使用的選項,使用服務器垃圾收集
...什麼我需要知道的是什麼觸發gen2集合,而不是服務器垃圾收集器更好(我已經知道了)。
我已經在使用服務器垃圾收集器(由於每個核心規則有一個堆,所以它具有更多的核心性能)。雖然我感謝你的有用建議,但並沒有真正回答我的問題:( – 2011-05-27 01:06:12
@傑弗裏:查看我的關於大對象堆的編輯。 – 2011-05-27 12:31:56
這是一個很好的觀點。雖然我認爲我沒有這樣做,但是我的LOH堆通常只有一個陣列,但我會進一步深入檢查一下。 – 2011-05-27 13:10:06