首页 > 其他分享 >.Net核心级的性能优化(GC篇)

.Net核心级的性能优化(GC篇)

时间:2023-10-13 09:55:20浏览次数:30  
标签:配置 回收 GC 垃圾 DOTNET Net 默认值 优化

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

标签:配置,回收,GC,垃圾,DOTNET,Net,默认值,优化
From: https://www.cnblogs.com/tangyanzhi1111/p/17761216.html

相关文章

  • TimesNet:时间序列预测的最新模型
    2020年发布的N-BEATS、2022年发布的N-HiTS和2023年3月发布的PatchTST开始。N-BEATS和N-HiTS依赖于多层感知器架构,而PatchTST利用了Transformer架构。2023年4月发表了一个新的模型,它在时间序列分析的多个任务中实现了最先进的结果,如预测、imputation、分类和异常检测:TimesNet。T......
  • 软件开发人员 Kubernetes 入门指南|Part 2
    在第1部分中,我们讲解了Kubernetes的核心组件,Kubernetes是一种开源容器编排器,用于在分布式环境中部署和扩展应用程序;我们还讲解了如何在集群中部署一个简单的应用程序,然后更改其副本数量以扩大或缩小其规模。 在本文中,我们将为您深入讲解Kubernetes提供的网络和监控功能,......
  • Kubernetes:根据进程 Pid 获取 Pod 名称
    前言在管理Kubernetes集群的过程中,我们经常会遇到这样一种情况:在某台节点上发现某个进程资源占用量很高,却又不知道是哪个容器里的进程。有没有办法可以根据进程PID快速找到Pod名称呢?解决假设现在有一个prometheus进程的PID是14338:要获取容器的ID,可以查看PID对应......
  • 4款.NET开源的Redis客户端驱动库
    前言今天给大家推荐4款.NET开源免费的Redis客户端驱动库(以下排名不分先后)。Redis是什么?Redis全称是REmoteDIctionaryService,即远程字典服务。Redis是一个使用C语言编写的、开源的(遵守BSD协议)、支持网络、可基于内存亦可持久化的日志型、Key-Value的NoSQL数据库。NewLife.......
  • win Server系统安装“.NET Framework 3.5”
    Win2012、Win2016中.NETFramework版本分别是4.5与4.6,因此需要手动安装 .NETFramework3.5。(Win2012和Win2016中的.NET3.5不通用)iso镜像sources/sxs目录中有 .NETFramework3.5安装文件(路径:sources/sxs)将文件单独放如一个目录当中,并在系统中调用   ......
  • 斜率优化
    斜率优化是一种优化\(dp\)的方法,不过在哪之前,我们需要引入一道例题。点击查看代码给你一个长度为$n$序列$A$,你需要把他分成若干段。定义第$x$段的贡献为:$$a\times(\sum_{i=l_x}^{r_x}a_i))^2+b\times\sum_{i=l_x}^{r_x}a_i+c$$你需要最大化贡献。$a,b,c$为......
  • [AGC030F] Permutation and Minimum 题解
    PermutationandMinimum看到300的数据范围,再加上计数题,很容易就往计数DP方向去想。为方便,我们将\(n\)乘二。因为是两个位置取\(\min\),于是我们便想到从小往大把每个数填入序列。于是DP数组第一维的意义便出来了:当前已经填入了前\(i\)小个数。考虑当前填入一个数。这......
  • [AGC013E] Placing Squares 题解
    PlacingSquares关键是将问题从抽象的“正方形面积”转为具象的形式:一段长度为\(d\)的区间,有两个不同的小球要放进去,则总放置方案就是\(d^2\),且不同的区间间方案是通过乘法原理结合的,刚好是题目中\(\prodd^2\)的形式。于是我们可以设计DP:设\(f_{i,j}\)表示前\(i\)个......
  • 关于 C# / .Net / IIS Web Service 调用 exe
    转自:https://blog.csdn.net/sby5104/article/details/110189048最近一个面试,面试官说他们现在的架构是通过IIS部署的WebService调用Server端的WindowsApplication也就是exe。面试拉跨之后自己尝试了一下这种实现方式,在这里记录一下自己遇到的坑,然后留一下查到的解决方案。......
  • Java Stream 优化java代码
    使用strteam就是为了代码更加简洁,同时功能又不会收到影响,废话不多说使用原始流使用int、long和double等基本类型时,请使用IntStream、LongStream和DoubleStream等基本流,而不是Integer、Long和Double等装箱类型流。原始流可以通过避免装箱和拆箱的成本来提供更好的性......