如何使.NET垃圾收集频率降低?

zza*_*ndy 8 .net garbage-collection

我有一个应用程序,处理大量的小对象,例如每秒2000条消息.一条消息大约是100字节,可能更少.应用程序运行在负载下6个半小时,在这段时间它有264 416 0 根的集合,166 699 1 第一根和69 608 2 根.这是每秒11.6,7.3和3个集合.

问题是如何减少垃圾收集频率?

UPD: 应用程序是一个从WCF接收消息的服务器,通过几个处理模块将它们保存到数据库中.

我的印象是GC应该在一段时间后适应并增加发电量,但事实并非如此.

UPD 2:正如leppie的回答所建议的那样,服务器模式下 GC确实减少了10倍的收集.而且,正如Richter所描述的那样,频繁的收藏并不是一件坏事.

Mar*_*ell 9

是什么让你觉得这会影响你?特别是,gen-0系列非常非常便宜 - 值得鼓励.

我会更多地看看""可能会导致其中一些请求将gen-0转换为gen-1; 我是否不必要地抓住任何物体,例如通过事件?"

当然,另一件需要注意的事情是:是否有任何地方可以避免创建不必要的对象,例如:

  • 你在循环中进行字符串连接,StringBuilder而不是吗?
  • 任何可以使用正确长度初始化的中等到大型集合,以避免重新分配?
  • 任何可以重复使用的临时缓冲区?例如,你做了很多byte[]在方法中使用简短的编码工作,在那里它byte[]可以作为临时区域传递,还是从池中获取?
  • 任何其他可以缓存和重用的东西 - 例如,new Regex("some literal")在方法内创建的,可以被创建为静态字段,以及为性能编译
  • 任何可以使用实习的密集字符串解析?(不一定是内置的interner)


lep*_*pie 5

gcServer="true"如果您在 app.config 中启用,您将获得大约 10 倍的 GC 减少。但请注意,这不会提高性能,并且如果应用程序是桌面应用程序,您的应用程序的延迟可能会增加。

这是 app.config 设置:

<runtime>
  <gcServer enabled="true"/>
</runtime>
Run Code Online (Sandbox Code Playgroud)