1.前言
大部分人對於.Net效能最佳化,都停留在業務層面。或者簡單的.Net框架配置層面。本篇來看下.Net核心部分GC垃圾回收配置:保留VM,大物件,獨立GC,節省記憶體等.Net8裡面有很多的各種GC配置,用以幫助你的程式進行最大程度效能提升和最佳化。
文章分為兩部分,第一個是GC有哪些動作可以效能最大的最佳化,第二部分就是如何配置這些動作以便讓你的程式達到這些效能效果。
2.GC動作
1.節省記憶體:System.GC.ConserveMemory(預設值為0)
2.獨立GC:DOTNET_GCName(預設值,coreclr.dll的預設GC)
3.大型物件堆閾值DOTNET_GCLOHThreshold(預設值85000位元組,指定值必須大於其)
4.允許大型物件DOTNET_gcAllowVeryLargeObjects(預設垃圾回收大於2GB的陣列,也就是預設值為1)
5.大型頁面DOTNET_GCLargePages,指示堆硬限制是否使用大型頁面 DOTNET_GCLargePages(預設值為0,也即是不使用)
6.保留VM,DOTNET_GCRetainVM。意思是把一個經過垃圾回收,沒有物件的段是被系統回收還是放在堆段列表,以便下次使用.(預設值false,被系統回收)
7.高記憶體百分比DOTNET_GCHighMemPercent,當實體記憶體負載大於其指定的值的時候,進行完整的垃圾回收,以便騰出跟多空間(預設負載閾值介於90%到 97%之間)
8.物件堆限制百分比
DOTNET_GCHeapHardLimitSOHPercent,DOTNET_GCHeapHardLimitLOHPercent,DOTNET_GCHeapHardLimitPOHPercent.分別為小物件堆,大物件堆,固定堆的限制百分比。
9.物件堆限制
DOTNET_GCHeapHardLimitSOH,DOTNET_GCHeapHardLimitLOH,DOTNET_GCHeapHardLimitPOH可以根據每個物件堆指定 GC 的允許堆使用量
10.堆限制百分比DOTNET_GCHeapHardLimitPercent預設值(僅在某些情況下適用)是20MB或容器記憶體限制的75%(以較大者為準)
11.堆限制DOTNET_GCHeapHardLimit預設值(僅在某些情況下適用)是20MB或容器記憶體限制的75%(以較大者為準)
12.關聯DOTNET_GCNoAffinitize指定是否將垃圾回收執行緒與處理器關聯。若要關聯一個 GC 執行緒,則意味著它只能在其特定的 CPU 上執行。為每個 GC 執行緒建立一個堆。
13.CPU組DOTNET_GCCpuGroup,配置垃圾回收器是否使用CPU組。(預設值為0,表示不會跨CPU組)
14.關聯範圍DOTNET_GCHeapAffinitizeRanges,指定用於垃圾回收器執行緒的處理器列表。以逗號分隔的處理器編號列表或處理器編號範圍。
Unix 示例:“1-10,12,50-52,70”
Windows 示例:“0:1-10,0:12,1:50-52,1:70”
15.關聯掩碼DOTNET_GCHeapAffinitizeMask,指定垃圾回收器執行緒應使用的確切處理器數。
16.堆計數DOTNET_GCHeapCount限制透過垃圾回收器建立的堆數。
3.配置
配置這些GC設定,主要是可以從三個方面來配置。
其一:執行時配置檔案runtimeconfig.json
以保留VM為例:
{
"runtimeOptions": {
"configProperties": {
"System.GC.RetainVM": true
}
}
}
其二:MSbuild配置
以保留VM為例:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RetainVMGarbageCollection>true</RetainVMGarbageCollection>
</PropertyGroup>
</Project>
其三:環境變數配置
Windows CMD:
set DOTNET_GCRetainVM=true
Windows Powershell:
$env:DOTNET_GCRetainVM=true
Unix/Linux
export DOTNET_GCRetainVM=true
以上16個GC動作均可以透過這個三個配置方式來進行配置。
參考微軟官網:
https://learn.microsoft.com/en-us/dotnet/core/runtime-config/garbage-collector
歡迎關注公眾號:jianghupt,文章首發,以及更多高階內容分享。