2011-05-07 29 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