.Net核心級的性能優化(GC篇)

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,文章首發,以及更多高階內容分享。
image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章