C#和.Net垃圾收集器性能

Ale*_*ecu 19 c# garbage-collection

我正在尝试使用C#和.NET制作游戏,并且我计划实现更新游戏世界中游戏对象的消息.这些消息将是C#引用对象.

我想要这种方法,因为如果我想让游戏成为多人游戏,那么这样做会更容易通过网络发送它们.

但是,如果我有很多消息,垃圾收集器会不会很紧张?这不会影响游戏玩法吗?消息类本身很小,最多只有4或5个成员.

对于游戏世界中的每个对象,这些消息将每秒生成几次.

Yus*_*rke 21

在.NET中,垃圾收集器有3代,第0代,第1代和第2代.每次GC无法在一代中收集对象时,该对象将被提升为下一代.

如果对象大于85kb,则可能会遇到问题.这些对象将自动存储在大对象堆中.在以下情况下将自动收集大对象堆:

  • 分配超过大对象堆阈值.
  • 系统处于低内存状态.
  • System.GC.Collect 被称为第2代.

问题是,当收集大对象堆时,对象的内存被释放,但LOH没有被压缩.因为LOH是碎片化的,SystemOutOfMemory如果在LOH上没有足够大的空间用于对象,则可能会抛出异常.

诸如对象池之类的技术通常用于改善LOH的性能. http://en.wikipedia.org/wiki/Object_pool_pattern

来源:http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

更新: .Net 4.5.1允许您使用GC.Collect API在您的应用程序中按需压缩LOH.

  • 这是一个惊人的答案,我不知道为什么它没有获得更多的选票.澄清了很多关于GC的工作原理(其中大部分我都不知道).+1 (2认同)

Lui*_*ipe 18

更高版本的GC,但更确切地说是4.5,在0级和1级代码中异步运行.这大大降低了GC的影响.

如果您的对象是短暂的,它们不应该在大多数时间从第0代传递.0级是GC清理最快的一代.

最重要的是,我不会因为担心GC性能而过早地优化我的代码.

过早的优化是 DonaldKnuth 所有邪恶的根源

就个人而言,我建议这篇文章有更深入的了解