.net - 如何减少 .NET 垃圾收集的频率?

标签 .net garbage-collection

我有一个处理大量小对象的应用程序,例如每秒 2000 条消息。一条消息大约 100 个字节,也许更少。该应用程序在负载下运行了 6 个半小时,在此期间它有 264 416 个第 0 代集合,
166 699 第一代和 69 608 第二代。这分别是每秒 11.6、7.3 和 3 次收集。

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

更新:
应用程序是从 WCF 接收消息的服务器,通过几个处理模块将它们推送并保存到数据库中。

我的印象是 GC 应该在一段时间后适应并增加生成大小,但显然情况并非如此。

更新 2 : 正如 leppie's answer 中的建议服务器模式下的 GC 确实使收集次数减少了 10 倍。此外,(正如 Richter 所描述的那样)频繁收集似乎不是一件坏事。

最佳答案

是什么让您认为这对您产生了影响?特别是,gen-0 系列非常非常便宜——值得鼓励。

我会更多地研究“”可能导致其中一些请求将 gen-0 转义为 gen-1 的原因;我是否不必要地捕获任何物体,例如通过事件?”。

当然,还有一点要看的是:有没有什么地方可以避免创建不必要的对象,例如:

  • 您是否在可能是 StringBuilder 的循环中进行字符串连接?反而?
  • 任何可以使用正确长度初始化以避免重新分配的中型到大型集合?
  • 任何可以重复使用的暂存缓冲区?例如,您是否进行了大量使用 byte[] 的编码工作?简要介绍一种方法,其中 byte[]可以作为划痕区域传递,还是从游泳池中抓取?
  • 任何其他可以缓存和重用的东西——例如,new Regex("some literal")在方法中创建,可以将其制成静态字段,并为性能而编译
  • 任何可以使用实习的密集字符串解析? (不一定是内置的内部人员)
  • 关于.net - 如何减少 .NET 垃圾收集的频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4931309/

    相关文章:

    c# - 使用反射调用静态方法时如何通过ref传递参数?

    c# - MVC 脚手架和 EF 'One To Zero or One' 关系错误

    java - 错误 java.lang.OutOfMemoryError : GC overhead limit exceeded

    c# - 循环计算器

    c# - 对象中的 EF6 AddOrUpdate 对象

    c# - 图像处理循环中的内存异常(需要比 GC.collect 更好的解决方案)

    Ruby 垃圾回收堆槽大小

    c++ - 控制Lua5.1的垃圾收集器

    c# 对 javascript 函数的多次调用不起作用

    garbage-collection - 如何监控 haxe cpp 垃圾收集器?