CLR via C# 讀書筆記 5-7 GC的工作模式
垃圾回收目前支持兩種工作模式, 并且在進程運行過程中無法修改這個工作模式
1.工作站模式,該模式為客戶端應(yīng)用程序優(yōu)化,GC假設(shè)當(dāng)前機器上還有其他應(yīng)用程序并且它們都沒有完全占用CPU,工作站還有兩個子模式
1)支持同時收集
會有更好的交互體驗,因此適用于GUI應(yīng)用程序,通常這個模式會占用更多的內(nèi)存,并且性能更差
2)不支持同時收集
2.服務(wù)器模式,該模式為服務(wù)器端應(yīng)用程序優(yōu)化,該模式假設(shè)當(dāng)前應(yīng)用程序是服務(wù)器上唯一的應(yīng)用程序,該模式會導(dǎo)致托管堆被分隔為多個部分,每一個CPU一份.并且這些部分是可以并行執(zhí)行的,
默認情況下應(yīng)用程序運行在工作站模式,并且支持同時收集
(Asp.net和Sqlserver 默認采用服務(wù)器模式)
如果服務(wù)器應(yīng)用程序運行在單處理上,那么GC會采用工作站模式并且不支持同時收集
一個自為宿主的應(yīng)用程序可以通過配置文件來控制GC的工作模式,如下所示
<configuration>
<runtime>
<gcServer enabled="true"/>
<gcConcurrent enabled="false"/>
</runtime>
</configuration>
同時我們可以通過System.Runtime.GCSettings.IsServerGC 來獲取當(dāng)前GC的工作模式
此外CGSettings中還可以設(shè)置一些有用的屬性 例如GCLatencyMode可以設(shè)置為為Batch , Interactive , LowLatency
其中如果選擇了LowLatency模式, GC會避免回收generation 2的對象(當(dāng)然 我們可以手動調(diào)用GC.Collect來回收,或者windows報告內(nèi)存太少的時候也會觸發(fā)回收)
浙公網(wǎng)安備 33010602011771號