一直以为.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
时间: 2024-10-01 03:50:31