博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CLR中垃圾回收器模式
阅读量:6251 次
发布时间:2019-06-22

本文共 1463 字,大约阅读时间需要 4 分钟。

垃圾回收器有2种不同的工作模式,分别为工作站模式(Workstation)和服务器模式(Server),按照GC线程的工作方式,又可以分成并发方式(Concurrent),非并发方式(Non-concurrent)。

在工作站模式上,可以运行并发方式和非并发方式,而在服务器模式上,只能运行非并发方式。在.NET4.0后,工作站模式和服务器模式上都引入了另一种新模式,后台GC模式。

无论是在工作站模式还是在服务器模式上,只要是非并发方式都称为阻塞式GC。因为这种方式下,GC运行的时候,都会挂起对应CPU上的所有托管线程,然后清理内存完毕后,才恢复挂起的内存。在这期间,其他的代码是无法运行的。

工作站模式是默认的,并且总是运行在单核的CPU上,如果需要设置成服务器模式那么需要在配置文件中设置gcServer="true".如下:

<configuration>

   <runtime>

      <gcServer enabled="true|false"/>

   </runtime>

</configuration>

如果是单核CPU,那么即使设置了gcServer="true",也是无效的,仍然会按照工作站模式运行。gcServer标签是在.NET2.0的时候引入的。

工作站模式下默认是为并发方式,可以通过下面的标签修改成非并发方式:

<configuration>

   <runtime>

      <gcConcurrent enabled="true|false"/>

   </runtime>

</configuration>

之前说过,工作站模式下的非并发GC,在工作的时候,会把所有的托管线程挂起,然后在清理内存。而并发方式却不同,开启了并发GC的情况下,在开始的时候会给第0代一个很大的空间来保证垃圾回收运行期间有足够的空间分配对象。由于第0代和第1带的回收非常的快(毫秒级),所以在第0代和第1代上的回收是不做并发的,只有在第2代回收时才会并发。当第2代回收的时候,有一个专门的GC线程去做(和其他托管线程并发运行),其他托管线程只能在第0代和第1代上分配空间。并发垃圾回收通过最大程度地减少因回收引起的暂停,使交互应用程序能够更快地响应。

服务器模式下:每个CPU有一个线程专门执行GC作业,并且托管的堆也会被分成好几个区域,每个线程回收它自己的托管堆,并且这些线程都是最高优先权的,这些线程都只做GC操作,这就使得GC速度很快,但也意味着用户线程会阻塞。服务器模式适合服务器应用程序,只关注高的响应率。

有关的设置关系,如下图:

其中后台方式(Background)在.NET4.0之后引入的。它和并发模式类似,但是却是并发模式的升级版,并且默认是开启的,这种后台方式将会替代并发模式的。在.NET4.0的时候,后台方式只能在工作站模式上运行,但是在.NET4.5后,工作站模式和服务器模式上都可以运行了。后台GC可以在第2代上执行的时候,同时在第0代和第1代上执行。这时第0代和第1代上的垃圾收集被称为前台方式。在后台GC工作时,根据需要可以启动另一个临时GC。与并发GC相同,后台GC只运用于完全的垃圾回收(第0、1、2代)并工作在独立的GC线程中,而临时GC则是阻塞式GC,也被称为前台GC。

后台方式的GC运行于服务器模式上时,和在工作站上的主要不同点在于执行后台GC线程的数量。工作站模式下总是单个线程,而服务器模式下会是每个CPU一个线程。

具体的细节可以参考以下网址:

(v=VS.100).aspx

(***)

转载地址:http://fousa.baihongyu.com/

你可能感兴趣的文章
Modular Inverse(模逆元,扩展欧几里德)
查看>>
高性能WEB开发之Web性能测试工具推荐
查看>>
找出两个文本文件的不同的行
查看>>
WPF笔记(1.2 Navigation导航)——Hello,WPF!
查看>>
练习PYTHON之GEVENT
查看>>
Web持久化存储Web SQL、Local Storage、Cookies(常用)
查看>>
node js 常用模块
查看>>
Libsvm和Liblinear的使用经验谈
查看>>
php生成curl命令行
查看>>
PHP中的数据库四、mongodb
查看>>
品读吴军"之"系列
查看>>
框架学习笔记:Unity3D的MVC框架——StrangeIoC
查看>>
Android NumberPicker 修改分割线颜色和高度及字体颜色大小
查看>>
树莓派键盘布局修正
查看>>
Android之Http通信——3.Android HTTP请求方式:HttpURLConnection
查看>>
hdu 5071 Chat(模拟)
查看>>
【转】 测试人员的职业规划 --整理标注
查看>>
C++智能指针--weak_ptr
查看>>
struts2的坑以及tomcat的一些常识
查看>>
HDURevenge of Segment Tree(第二长的递增子序列)
查看>>