• .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>trueRetainVMGarbageCollection>
      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

  • 相关阅读:
    Windows11 Android开发相关记录(持续更新...)
    UOS/Linux的root权限下启动一个带界面的程序
    asp.net课程设计司库管理系统-金融理财管理系统
    Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
    【Leetcode】1052. Grumpy Bookstore Owner
    python开篇——初识python
    【SpringBoot】Redission 的使用与介绍
    2.DesignForClines\4.BgaAutoRouting
    Java知识点整理 16 — Spring Bean
    【无标题】算法不能盲目刷!!算法修炼手册(持续更新)
  • 原文地址:https://www.cnblogs.com/tangyanzhi1111/p/17761216.html