C#Production Server,我收集垃圾吗?

bev*_*qua 6 c#

我知道这有很多线索.我读了一些.

我想知道在我的情况下是否正确 GC.Collect();

我有一台MMORPG服务器,在生产中它日夜在线.并且每隔一天重新启动服务器以实现对生产代码库的更改.每20分钟,服务器暂停所有其他线程,并序列化当前游戏状态.这通常需要0.5到4秒

GC.Collect();序列化之后是一个好主意吗?

显然,服务器不断创建和销毁游戏物品.

我会在性能或内存优化/使用方面获得臭名昭着的收益吗?

我不应该手动收集吗?

我已经读过如果在错误的时刻或太频繁地使用收集会如何变坏,但我认为这些存储既是收集的好时机,也不是那么频繁.

服务器在框架4.0中

更新回复评论:

我们随机经历服务器冻结,有时,出乎意料的是,服务器内存使用量将逐渐增加,直到它达到服务器占用太长时间来处理任何网络操作的程度.因此,我正在考虑许多不同的方法来解决这个问题,这就是其中之一.

Nov*_*zky 12

垃圾收集器知道什么时候运行,你不应该强迫它.它不会改善性能或内存优化.如果需要,CLR可以告诉GC收集不再使用的对象.

回答更新的部分: 强制收集不是解决问题的好方法.您应该更深入地了解一下代码,找出问题所在.如果内存使用量意外增长,则可能存在未正确处理的非托管资源问题,甚至是托管代码中的"漏洞代码"问题.

还有一件事.如果调用GC.Collect修复问题,我会感到惊讶.

  • @Nico,它主要用于测试目的.有时你需要测试一些代码,看看收集后会发生什么,所以你需要能够强制它. (2认同)
  • @Nico:http://stackoverflow.com/questions/478167/when-is-it-acceptable-to-call-gc-collect http://blogs.msdn.com/b/ricom/archive/2004/11/ 29/271829.aspx基本上回答的是你在生产代码中从不需要它. (2认同)
  • 我能听到一个很大的"AMEN !!"吗?诺维茨基几乎把它钉了起来.调用`GC.Collect`会将所有未收集的对象移动到gen 2,这使它们只能运行更长时间.所以这往往会让事情变得更糟. (2认同)