相關的類
GCLargeObjectHeapCompactionMode 枚舉
GCLargeObjectHeapCompactionMode 枚舉
屬性的值 GCSettings.LargeObjectHeapCompactionMode 是 GCLargeObjectHeapCompactionMode 枚舉的成員,該枚舉指示下一個完全阻止性垃圾回收是否還 (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; }