CSharp - C# 应使用"工作站"垃圾收集还是"服务器"垃圾回收?

  显示原文与译文双语对照的内容
50 5

我有一个大型多线程 C# 应用程序运行在多核 4-way 。 目前我们正在使用"服务器模式"垃圾收集。 然而,测试表明,工作站模式GC更快。

MSDN表示:

使用服务器API的托管代码应用程序从使用服务器优化的垃圾收集器( GC ) ( 而不是默认的工作站 GC ) 中获得。

工作站是默认的GC模式,在单处理器计算机上是唯一可用的。 工作站GC托管在控制台和 Windows 窗体应用程序中。 它与正在运行的程序同时执行完整的( 生成 2 ) 集合,从而减少延迟。 这种模式对于客户端应用程序非常有用,在这种情况下,感知性能通常比原始吞吐量更重要。

服务器GC仅在多处理器计算机上可用。 它为每个处理器创建一个单独的托管堆和线程,并并行执行集合。 在收集期间,所有托管线程都暂停( 只有在本地调用返回时才暂停运行本机代码的线程) 。 通过这种方式,服务器GC模式使吞吐量( 每秒请求数) 最大化,并随着处理器数量的增加而提高性能。 在具有四个或者更多处理器的计算机上表现尤其出色。

但是我们没有看到性能发光 ! 谁有什么建议?

时间: 原作者:

80 5

它不是很好解释,但是我可以说,服务器模式是同步的,而工作站模式是异步的。

换句话说,工作站模式适用于少量需要一致性能的长时间运行的应用程序。 垃圾回收尝试"不要 of",但在平均情况下效率降低。

服务器模式适用于每个"作业"相对短且由单个内核处理的应用程序( 编辑: 考虑多线程网络服务器。 它的想法是每个"作业"获得所有的cpu功率,并且快速完成,但是核心停止处理请求和内存。 因这里,在这种情况下,GC是更高效的,但是核心在运行时不可以用,因这里应用程序需要适应。

这听起来像是一个应用程序,它的线程相对耦合,在第一个模式而不是第二个模型。

但那只是after-the-fact的理由。 衡量系统( 就像ammoQ所说,不是你的GC性能,而是你的应用)的性能并使用你所测量的最佳性能。

原作者:
82 2

.NET 4.5引入并发服务器垃圾收集。

http://msdn.microsoft.com/en-us/library/ee787088.aspx


specify <gcServer enabled="true"/> 


specify <gcConcurrent enabled="true"/> (this is the default so can be omitted)



还有新的SustainedLowLatencyMode

在. NET 框架 4.5中,SustainedLowLatency模式对工作站和服务器GC都可用。 要打开它,请将 GCSettings.LatencyMode 属性设置为 GCLatencyMode.SustainedLowLatency 。

...