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 ,文章首发,以及更多高阶内容分享。