【C# .Net GC】GC初始化設置 和GcSetting


相關的類

GcSetting 類

GCLargeObjectHeapCompactionMode 枚舉

GCLargeObjectHeapCompactionMode 枚舉

屬性的值 GCSettings.LargeObjectHeapCompactionModeGCLargeObjectHeapCompactionMode 枚舉的成員,該枚舉指示下一個完全阻止性垃圾回收是否還 (LOH) 壓縮大型對象堆。 默認情況下,LOH 不會壓縮。 值 Gclargeobjectheapcompactionmode.compactonce 來壓縮指示阻止垃圾回收將壓縮 LOH。 垃圾回收后,屬性的值將 GCSettings.LargeObjectHeapCompactionMode 恢復為默認值。

GcSetting 類

按需壓縮大對象堆

即使使用了對象池,仍然可能會在大對象堆里分配對象,隨着時間的推移,在里面會存在很多碎片。從.NET 4.5.1 開始,你可以告訴GC在下一次做完整GC時順便也對LOH做一次壓縮。

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;

根據LOH的大小,這個壓縮過程可能會很慢,甚至會用到好幾秒。你最好是在你的程序能夠長時間暫停的時候,才讓垃圾回收器做一次這樣的完整GC。修改該設置值,只會在下一次完整GC時會觸發壓縮,一旦完成了LOH的壓縮,GCSettings.LargeObjectHeapCompactionMode就會被重新設置為GCLargeObjectHeapCompactionMode.Default。
因為這個過程很耗時,我還是建議你減少對LOH的分配或者使用對象池。這樣將大大減少壓縮的數據。壓縮LOH功能只能作為碎片過多,分配的堆太大時的最后手段。

GC初始化設置

工作模式:工作站、服務器

工作方式:后台、非並發

注意:工作方式 選項只影響第 2 代中的垃圾回收;第 0 代和第 1 代中的垃圾回收始終是非並發的,因為它們完成的速度很快。

可用不用設置采用默認的工作方式。工作站默認的第2代回收方式是  后台,服務器默認第2代回收方式是非並發的。

.net core 在.csproj 文件添加:

注意:根據.csproj 文件中配置 自動生成對應 【ProjectName】.runtimeconfig.json文件的項。工作站默認interactive(開啟並發), 服務器默認Batch(關閉並發)。

工作模式:服務器

<PropertyGroup>
  <ServerGarbageCollection>true</ServerGarbageCollection>
//true 是服務器模式,fasle 是工作台模式
</PropertyGroup>

 工作方式:后台

<PropertyGroup>
    <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
 //true 為后台對應的LatencyMode=interactove,false 為非並發對應的LatencyMode=Batch
 </PropertyGroup>

或者可以在ConsoleApp8.runtimeconfig.json 文件中直接添加代碼:

"configProperties": {
      "System.GC.Concurrent": true,  //true 為后台對應的LatencyMode=interactove,false 為非並發對應的LatencyMode=Batch
      "System.GC.Server": false//true 是服務器模式,fasle 是工作台模式 
}

 

代碼中查看配置結果:

//查看GC的初始配置:類型、工作方式以及微調工作方式。  類型、工作方式在.json或xml文件中修改。不過可用在程序運行時候微調
Console.WriteLine($"IsServerGC:{GCSettings.IsServerGC}");// 是否服務器GC
Console.WriteLine($"IsConcurrent:{System.GC.GetGCMemoryInfo().Concurrent}");//工作方式 System.GC  
Console.WriteLine($"LatencyMode:{GCSettings.LatencyMode}");// 微調工作方式狀態

在程序中微調工作方式:

工作站默認interactive(開啟並發), 服務器默認Batch(關閉並發)。

using System.Runtime;
//查看GC的初始配置:類型、工作方式以及微調工作方式。  類型、工作方式在.json或xml文件中修改。不過可用在程序運行時候微調
Console.WriteLine($"IsServerGC:{GCSettings.IsServerGC}");// 是否是服務器GC
Console.WriteLine($"IsConcurrent:{System.GC.GetGCMemoryInfo().Concurrent}");//工作方式 System.GC  
Console.WriteLine($"LatencyMode:{GCSettings.LatencyMode}");// 微調工作方式狀態

 
Console.WriteLine("GC的工作方式進行微調 將默認的模式修改成Batch");
GCLatencyMode oldGCL=GCSettings.LatencyMode;//獲取當前進程 GC 工作方式的微調模式 
try
{
    GCSettings.LatencyMode = GCLatencyMode.Batch;
    //要執行其他代碼
}
finally 
{

    Console.WriteLine($"IsConcurrent:{System.GC.GetGCMemoryInfo().Concurrent}");// //System.GC
    Console.WriteLine($"LatencyMode:{GCSettings.LatencyMode}");// 工作方式
    //修改回去
    GCSettings.LatencyMode=oldGCL;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM