我有託管爲具有以下功能的窗口服務的WCF服務:我應該調用GC.Collect
列表<消息>對象(往往不是)使用高達1 GB的內存,在這樣的情況下調用GC.Collect是否合理,因爲我不再使用這個列表,或者我應該讓垃圾收集器自己處理這個問題?
我有託管爲具有以下功能的窗口服務的WCF服務:我應該調用GC.Collect
列表<消息>對象(往往不是)使用高達1 GB的內存,在這樣的情況下調用GC.Collect是否合理,因爲我不再使用這個列表,或者我應該讓垃圾收集器自己處理這個問題?
簡短的回答:沒有。
如果您致電GC.Collect()
,您可能有問題。需要調用它非常罕見。
在當前的例子中,這將不利於鑑於當前的代碼。除非你身體上明確對象列表對象,它們將不會被垃圾收集,因爲調用者仍然引用到該對象中的那個List<T>
實例。
當然,這個建議是基於引用不存在於每個Message
對象的假設。
爲Queue<T>
或Stack<T>
根據您的訂單,您可能通過從List<T>
的消息對象,一旦他們已處理添加一些更多的決定於你的過程中,或通過切換到一個數據結構,它體現了這一原則本身,例如要求。
public int SendMultipleMessages(Queue<Message> messages)
{
while (messages.Count > 0)
{
var message = messages.Dequeue();
// do something with message, and once you're done it is
// probably eligible for garbage collection because it is
// no longer in the Queue
}
Task.Factory.StartNew(() =>
{
//very time demanding task
_sendRequestHandler.SendMultipleMessages(BatchId);
});
return BatchId;
}
謝謝你的建設性和徹底的答案.. – Nicolai 2013-03-04 16:36:03
讓GC自我管理,將不同,這取決於可用的資源每臺機器上的優化等,所有你很可能自己稱它做的是傷害你的應用程序的性能。
這回答了標題,但不是更具體的問題。 – user7116 2013-03-04 16:28:48
讓GC處理之。它比我們知道的僅僅是關於記憶力等等的凡人。 – 2013-03-04 16:23:41
可能重複[什麼時候可以調用GC.Collect?](http://stackoverflow.com/questions/478167/when-is-it-acceptable-to-call-gc-collect) – 2013-03-04 16:24:27
好吧,考慮到名單仍然在範圍之內,無論如何都無法在這一點上收回。 – Servy 2013-03-04 16:24:31