.net 垃圾回收 工作站与服务器区别

一直以为.net中垃圾回收都是单线程的,原来其实可以并发。 

以下是工作站垃圾回收的线程处理和性能注意事项:

  • 回收发生在触发垃圾回收的用户线程上,并保留相同优先级。 因为用户线程通常以普通优先级运行,所以垃圾回收器(在普通优先级线程上运行)必须与其他线程竞争 CPU 时间。

    不会挂起运行本机代码的线程。

  • 工作站垃圾回收始终用在只有一个处理器的计算机上,而不管 <gcServer> 设置如何。 如果你指定服务器垃圾回收,则 CLR 会使用工作站垃圾回收,并禁用并发。

以下是服务器垃圾回收的线程处理和性能注意事项:

  • 回收发生在以 THREAD_PRIORITY_HIGHEST 优先级运行的多个专用线程上。

  • 为每个 CPU 提供一个用于执行垃圾回收的一个堆和专用线程,并将同时回收这些堆。 每个堆都包含一个小对象堆和一个大对象堆,并且所有的堆都可由用户代码访问。 不同堆上的对象可以相互引用。

  • 因为多个垃圾回收线程一起工作,所以对于相同大小的堆,服务器垃圾回收比工作站垃圾回收更快一些。

  • 服务器垃圾回收通常具有更大的段。 但是请注意,这是通常情况:段大小特定于实现且可能更改。 调整应用程序时,不应假设垃圾回收器分配的段大小。

  • 服务器垃圾回收会占用大量资源。 例如,如果在一台具有 4 个处理器的计算机上运行了 12 个进程,则在它们都使用服务器垃圾回收的情况下,将有 48 个专用垃圾回收线程。 在高内存加载的情况下,如果所有进程开始执行垃圾回收,则垃圾回收器将要计划 48 个线程。

如果运行应用程序的数百个实例,请考虑使用工作站垃圾回收并禁用并发垃圾回收。 这可以减少上下文切换,从而提高性能。

ref:https://msdn.microsoft.com/zh-cn/library/ee787088(v=vs.110).aspx

原文地址:https://www.cnblogs.com/lvjianwei/p/5543712.html