.NET程序优化(GCServer )

本文介绍了.NET Framework 2.0中的GCServer模式,探讨了其如何针对服务器端高吞吐量和扩展性进行优化,以及如何通过配置启用该模式。同时,对比了不同GC模式的特点。

现在的服务器都是多个cpu,在.NET Framework 2.0在GC上有个新特性GCServer ,不知道有多少人用过这个东东。

关 于GC可以看这篇文章 GC是如何工作的,不同的代的大小是多少 文章中提到有三种模式的GC,分 别对应优化不同类型的应用程序。

Server GC

这种类型的GC是针对服务器端高吞吐量和高扩展性进行优化的,那情况是一种长时间的加载和请求不停地分配和重新分 配,并维持在较高水准的情况。

这种server GC 使用每个处理器一个堆、一个GC线程,并尽量的保持堆之间的平衡。在垃圾收集的时候,GC线程工作在各自的线程中,这样就最小化了锁资源,就保证了在这种 应用条件下最有效的工作。

这种类型的GC只有在多处理器的机器上可见,如果你在单处理器上的设置这种模式,那你将得到实际运行的模式是非并 发的workstation版本(Non Concurrent)。现在的双核也是这种模式,intel的超线程技术实现的cpu并不是真实的多cpu,因此它不会使用这种模式。

Asp .net 在多cpu的机器上默认使用这种模式,如果你想使用server GC模式,你可以在应用程序级别上做如下设置:

<configuration>ITPUB个人空间O�w6~+Oul'I]
<runtime>ITPUB个人空间5}6_e fn$y!g
   <gcServer enabled="true " />
"U/v%|#P!{6M5~&hs0 </runtime>
@j*yBF ~8l/p0 </configuration>

Workstation GC – Concurrent

这种被用来作为winform应用程序和windows services 服务程序的默认设置。

这种模式是对交互的应用程序,这种程序要求应用程序不能暂停,即时一个相对很短暂的时间也是不行 的。因为暂停进程会让用户界面闪烁或者当点击按钮的时候感觉应用程序没有响应。

这种实现方式是当进行Gen 2 收集的时候,将cpu和内存的使用量作为更短的停顿时间。

Workstation GC – Non Concurrent

这种模式是模仿Server GC,只是收集是发生在引起GC的进程上,这种模式推荐为那种运行在单个cpu上的服务类型的应用程序。可以修改应用程序级上的配置来把 concurrency 关闭。

<configuration>
P&VyNf_,xbrF0 <runtime>
$jMB Vu+i%K-n0    <gcConcurrent enabled="false" />
]'{Br9U+b{ G!p0 </runtime> ITPUB个人 空间'O y1}Joj4|p
</configuration>

启用 GCServer有什么意义呢,主要是会进行垃圾整理,这样就可以避免垃圾脆片的问题影响。需要验证这个问题的例子可以参见这篇文章Memory Management (III) - .NET CLR ? ,文章中包含一个测试 代码。代码如下:

class ProgramITPUB个人空间w5z3^5Y(Fu/U
   {ITPUB个人空间$qo;Q3d{'vu
       static void Main(string[] args)
"w/v|,pe7V'u0        {
p2y9b,zNf7G+b,T0            List<byte[]> buffer1 = new List<byte[]>();ITPUB个人空间#J/d_Z+~'n
           List<byte[]> buffer2 = new List<byte[]>();ITPUB个人空间c/T(sE P P3R
           List<byte[]> buffer3 = new List<byte[]>();
r;^7m+B|;U9j�U%nQ!CT0            //            //    allocate             //          ITPUB个人空间7H)pO9U @#nt
           Console.WriteLine();
R kAX*m'xj0            Console.WriteLine();ITPUB个人空间+A$W&^)s~6lIII
           Console.WriteLine("1. Allocate 64mb block(s) as more as possible...");
f F2{R@8]0            tryITPUB个人空间6k,H!}3Mh�h` c~_
           {ITPUB个人空间sFiY;@*GS�`3srY
               while (true)ITPUB个人空间6hH I5Z3uh6u^|!l9w
               {
nnkWU8te+d0                    buffer1.Add(new byte[64 * 1024 * 1024]);
tv|9Ie2}iN@J0                    Console.Write("#");ITPUB个人空间9U,q'V!k$rD8d
                   buffer2.Add(new byte[64 * 1024 * 1024]);
D b C:A�W7B`A0                    Console.Write("#");
i1IrY N?3Tn/2`[0                }
m0u1tj z+ubp {}0            }
&y(xG^`ZHs0            catch (OutOfMemoryException)
_ZK H:E0            {

           }
ZTxO-D%I _4O]8^0            Console.WriteLine();
'j U)C'esz0            Console.WriteLine("   Total {0} blocks were allocated ( {1} MB).", (buffer1.Count + buffer2.Count), (buffer1.Count + buffer2.Count) * 64);ITPUB 个人空间t"Xx-z6{9v t!e
           // //    free            //    
r b7X4P5Qq0            Console.WriteLine();
/pw&K8D*_(c0            Console.WriteLine();ITPUB个人空间e0s-i3ZK2~
           Console.WriteLine("2. Free Blocks...");
S]@b#nMi-V0            buffer2.Clear();
6g#@hngz0            Console.WriteLine("   Total: {0} blocks ({1} MB)", buffer1.Count, buffer1.Count * 64);ITPUB个人空间V,h#A!c|,aV
           //            //  GC            // 
M�NF!FL,X0            GC.Collect(GC.MaxGeneration);ITPUB个人空间 ^3c,U7DW5Fr
           //            //    allocate            //    
3Ezh*@H;E2]$Ub0            Console.WriteLine();
-ddr c;A9A5mw0            Console.WriteLine();ITPUB个人空间nxX_$Xy
           Console.WriteLine("3. Allocate 72mb block(s) as more as possible...");ITPUB个人空间4LuC1D} rjG+x:K
           try
XvU#Hlt Z0            {
bR:Zl p JH V0                while (true)ITPUB 个人空间u%B?*Y3P,WR
               {ITPUB个人空间Hk'o/A-v)j/x
                   buffer3.Add(new byte[72 * 1024 * 1024]);
3aV[fu)N)K1fQ0                    Console.Write("#");ITPUB个人空间 `!]C:Ns,Y5AI8C c
               }ITPUB个人空间en M%d ZmbE
           }ITPUB个人空间 S'zc ]i hwB%w?r
           catch (OutOfMemoryException)
jY{8d r:G]Z0            {
0vxV6yUL^hn0            }
y8B|,L'G6Y0j7@Q)^.u0            Console.WriteLine();
9Og8s'N#qD+ad{0            Console.WriteLine("   Total: 64mb x {0}, 72mb x {1} blocks allocated( {2} MB)./n", buffer1.Count, buffer3.Count, buffer1.Count * 64 + buffer3.Count * 72);ITPUB个人空间S1|'B4lyX D i
           Console.ReadLine();
b+pp@2[%H-t(v8i0        }ITPUB 个人空间+wwSeV/I|b
   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值