我有一个处理大量小对象的应用程序,例如每秒 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/