.NET GC
垃圾回收模式
System.Runtime.GCSettings类有IsServerGC 和 LatencyMode控制运行时垃圾回收特性
IsServerGC是只读属性,表明是否是服务器垃圾回收下运行,无法在运行时切换
LatencyModel 可以接受GCLatencyModel枚举值
Batch(一批,分批处理的意思)对应非并发垃圾回收
Interactive (交互,互动)对应并发垃圾回收
LowLatency,SustainedLowLatency 告诉垃圾回收代码正在执行时间敏感的操作,这时候运行垃圾回收对应用程序有害。
LowLatentcy在.NET3.5引入 只能在并发工作站垃圾回收下使用,用于执行短时的时间敏感的操作。
SustainedLowLatency 在.NET4.5中引入,可以在工作站和服务器垃圾回收上使用,可以在长时间操作时避免应用程序被完全垃圾回收阻塞
低延迟垃圾回收模式使垃圾回收器在非必要的情况下避免垃圾回收。低延迟不是关闭垃圾回收,仍然可以进行局部垃圾回收,但是GC占用应用程序时间显著降低。
低延迟模式应尽量短,避免推出低延迟模式后遗症,存在大量需要回收的内存,影响应用程序的性能。
工作站垃圾回收
并发工作站和非并发工作站,独立的GC线程
并发工作站:标记时并发,清理阶段都会挂起。
非并发工作站:标记,清理都会挂起应用程序线程
并发是说垃圾回收线程和应用程序线程并发,并发工作站垃圾回收会在独立的线程上进行,此时GC Thread和App Thread 争抢cpc时间 ,如果UI线程引发GC则UI线程挂起(引发GC的线程挂起)不能体现并发工作站的响应性能,反而降低界面响应度。
服务器垃圾回收
每个cpu对应一个独立托管堆,每个cpu对应独立的GC线程,两个阶段都会挂起线程
后台垃圾回收
CLR1.0 引入并发工作站垃圾回收存在一个缺陷。在第二代并发垃圾回收过程中,应用程序可以继续分配内存,但是如果0,1代中空间不足就会阻塞并等待垃圾回收结束。
CLR4.0 引入后台垃圾回收。它允许一个完整的垃圾回收过程执行过程中 执行对第0代和第1代进行垃圾回收。为此CLR创建两个垃圾回收线程:前台垃圾回收县城,后台垃圾回收县城。
后台垃圾回收线程用于执行第2代垃圾回收,并周期性检查是否存在快速执行的第0代或者第1代垃圾回收请求。请求到来时,后台垃圾回收县城挂起,执行前台垃圾回收线程,前台垃圾回收线程快速执行并恢复程序线程。
CLR4.5服务器垃圾回收引入后台垃圾回收,并且服务器垃圾回收开始支持并发回收。 CLR创建N个前台垃圾回收线程和N个后台垃圾回收线程。后台垃圾回收线程负责第2代垃圾回收,并语序应用程序代码继续前台执行。前台垃圾回收线程在需要阻塞回收时开始执行,并根据CLR的需要执行压缩(此时的后台垃圾回收线程不会压缩),或者等待后台垃圾回收线程正在执行完全垃圾回收时执行“年轻代“垃圾回收。
1)并发工作站垃圾回收 ----默认特征;有后台垃圾回收
2)非并发工作站垃圾回收-----没有后台垃圾回收
3)非并发服务器垃圾回收----没有后太垃圾回收
4)并发服务器垃圾回收----有后台垃圾回收