2011-05-07 30 views
6

我知道有噸的線程這一點。我讀了其中幾個。C#生產服務器,我收集垃圾嗎?

我想知道如果我的情況下,它是正確的GC.Collect();

我有一個MMORPG的服務器,它在生產線上是白天和黑夜。並且服務器每隔一天重新啓動以實施對生產代碼庫的更改。服務器每隔20分鐘暫停所有其他線程,並序列化當前的遊戲狀態。這通常需要0.5到4秒

難道是一個好主意,系列化後GC.Collect();

的服務器,很明顯,不斷創建和銷燬遊戲道具。

我本來在性能或內存優化/使用一個臭名昭著的收益?

我不該手動收集?

我讀過有關如何收集,如果在錯誤的時刻使用,或過於頻繁可不好,但我想這些節省都是一個很好的時機,收集,而不是頻繁。

服務器處於框架4.0

更新在回答評論:

我們隨機遇到服務器死機,有時,出乎意料的是,服務器的內存使用量將越來越提高,直到達到一個點時,服務器處理任何網絡操作的時間太長。因此,我正在考慮許多不同的方法來解決這個問題,這是其中之一。

+0

爲什麼你想打電話給GC.Collect?有什麼問題嗎? – Novitzky 2011-05-07 22:39:35

+0

更新了我的問題背後的原因。 – bevacqua 2011-05-07 22:50:52

+3

你看到了這個問題,但你不知道根本原因,並開始選擇對你來說顯而易見的第一件事。嘗試找到根本原因(例如使用內存分析),然後找到合適的解決方案將會容易得多。 – Andrey 2011-05-07 22:58:57

回答

12

垃圾收集知道最好的時候跑,你不應該強迫它。 它不會改進性能或內存優化。 CLR可以告訴GC收集不再使用的對象,如果有需要的話。

回覆更新部分: 強制收集不是一個很好的解決方案。你應該看看你的代碼更深入一點,找出錯誤。如果內存使用量意外增長則可能是其處理不當,甚至託管代碼中的「漏碼」非託管資源的問題。

一件事。如果調用GC.Collect解決了問題,我會感到驚訝。

+0

那爲什麼Collect方法是公開的呢? – bevacqua 2011-05-07 22:46:10

+0

同意。除非你有問題,否則不要惹它。 – Andre 2011-05-07 22:46:25

+0

閱讀我的更新.. – bevacqua 2011-05-07 22:51:13

2

每隔20分鐘,服務器暫停所有其他線程,並將當前遊戲狀態序列化爲 。這通常需要 0.5到4秒

如果所有線程都已經暫停反正你不妨稱之爲垃圾收集,因爲它應該是相當快的,在這一點上。我懷疑這樣做只會掩蓋真正的問題,而不是真正解決問題。

我們隨機遇到服務器 死機,有時,出乎意料的是, 服務器內存使用情況將越來越多,直到它到達一個點 當服務器需要太長時間 處理任何網絡操作提高 。因此, 我正在考慮很多不同的方法來解決 的問題,這是其中之一 。

這聽起來更像是你實際上仍在引用所有這些使用內存的對象 - 如果你不是由於內存壓力,GC會運行並嘗試釋放這些對象。您可能正在查看生產代碼中的實際錯誤(即,仍然訂閱了事件的對象或者在不應該引用的對象時),而不是通過手動取出垃圾來解決問題。

如果可能在這種情況下,您應該運行性能分析以查看瓶頸的位置以及代碼的哪一部分導致內存分配的主要原因。

1

內存增加是否會被玩家用僞造/修改的遊戲客戶端「攻擊」?服務器在接受新客戶端連接時是否分配了大量內存?服務器能夠很好地處理輸入數據嗎?

+0

是的,它可能是。雖然這不太可能。沒有比創建遊戲項目時更多的內存分配給用戶連接。服務器確實處理輸入數據的僞造 – bevacqua 2011-05-08 01:21:24