2013-03-04 85 views
1

我有託管爲具有以下功能的窗口服務的WCF服務:我應該調用GC.Collect

列表<消息>對象(往往不是)使用高達1 GB的內存,在這樣的情況下調用GC.Collect是否合理,因爲我不再使用這個列表,或者我應該讓垃圾收集器自己處理這個問題?

+1

讓GC處理之。它比我們知道的僅僅是關於記憶力等等的凡人。 – 2013-03-04 16:23:41

+0

可能重複[什麼時候可以調用GC.Collect?](http://stackoverflow.com/questions/478167/when-is-it-acceptable-to-call-gc-collect) – 2013-03-04 16:24:27

+2

好吧,考慮到名單仍然在範圍之內,無論如何都無法在這一點上收回。 – Servy 2013-03-04 16:24:31

回答

5

簡短的回答:沒有

如果您致電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; 
} 
+0

謝謝你的建設性和徹底的答案.. – Nicolai 2013-03-04 16:36:03

1

讓GC自我管理,將不同,這取決於可用的資源每臺機器上的優化等,所有你很可能自己稱它做的是傷害你的應用程序的性能。

+0

這回答了標題,但不是更具體的問題。 – user7116 2013-03-04 16:28:48

相關問題