GC在.net3.5和.net4.0的变化
在3.5之前,我们拿GC是没有办法的。通常情况下我们的web server都是多线程+多核的,这时我们使用的是ServerGC模式。ServerGC最大的特点在于当GC发生时禁止了所有内存的分配活动,也就是说程序此时相当于停止响应了。但是这里带来的好处是将会有#procs * #cores的GC来一起完成任务,速度也快了很多。
但是对于高负载的asp.net来讲,GC是个问题,如果程序写的有问题,很有有可能就让工作的thread和GC的thread产生了lock等等等等…
所以在.net3.5出来的时候,GC可以在触发前通知程序,当时给我最直接的感觉就是当一台Web Server在触发GC之时就把负载转移到另一台Web Server上… 很帅~
与该功能有关的可以参考下面的几个方法:
GC.RegisterForFullGCNotification
在4.0中的Background mode的GC是允许在一个完整的background GC时开启一个新的GC(gen0和gen1),这样就可以在必要时分配一个新段(segment),这样可以避免很多引发blocking的情况了。