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

net,核心,性能,优化,gc · 浏览次数 : 0

小编点评

**GC垃圾回收配置** **一、GC动作** - **保存内存:**`System.GC.ConserveMemory(默认值为0)`:如果 `ConserveMemory` 设置为 `false`,则所有可用的内存都会分配给应用程序。 - **独立GC:**`DOTNET_GCName` 设置用于独立GC的名称。默认值为 `coreclr.dll`。 - **大型对象堆阈值:**`DOTNET_GCLOHThreshold` 设置大型对象堆的阈值。默认值为 85000 字节。 - **允许大型对象:**`DOTNET_gcAllowVeryLargeObjects` 设置允许使用大于 2 GB 的数组的垃圾回收。默认值为 `1`。 - **大型页面:**`DOTNET_GCLargePages` 设置使用大型页面堆的标志。默认值为 `0`,即不使用。 - **保留VM:**`DOTNET_GCRetainVM` 设置是否保留经过垃圾回收的段。默认值为 `false`,表示系统会回收这些段。 - **高内存百分比:**`DOTNET_GCHighMemPercent` 设置当物理内存负载超过其指定百分比时进行垃圾回收的标志。默认值为 90% 至 97%。 - **对象堆限制百分比:**`DOTNET_GCHeapHardLimitSOHPercent、`DOTNET_GCHeapHardLimitLOHPercent` 和 `DOTNET_GCHeapHardLimitPOHPercent` 设置对象堆限制的百分比。默认值为 20MB 或容器内存限制的 75%。 - **对象堆限制:**`DOTNET_GCHeapHardLimitPercent` 设置对象的堆限制百分比。默认值为 20MB 或容器内存限制的 75%。 **二、配置GC设置** - **运行时配置文件:**`runtimeconfig.json` 中保留 `System.GC.RetainVM` 设置。 - **MSbuild 配置:**设置 `RetainVMGarbageCollection` 属性为 `true`。 - **环境变量:**设置 `DOTNET_GCRetainVM` 到 `true`。

正文

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

与.Net核心级的性能优化(GC篇)相似的内容:

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

1.前言 大部分人对于.Net性能优化,都停留在业务层面。或者简单的.Net框架配置层面。本篇来看下.Net核心部分GC垃圾回收配置:保留VM,大对象,独立GC,节省内存等.Net8里面有很多的各种GC配置,用以帮助你的程序进行最大程度性能提升和优化。 文章分为两部分,第一个是GC有哪些动作可以性能

[转帖]腾讯服务注册中心演进及性能优化实践

https://my.oschina.net/u/4587289/blog/5577840 导语 注册中心作为微服务架构的核心,承担服务调用过程中的服务注册与寻址的职责。注册中心的演进是随着业务架构和需求的发展而进行演进的。腾讯当前内部服务数超百万级,日调用量超过万亿次,使用着统一的注册中心 ——

.NET周报 【4月第3期 2023-04-15】

国内文章 Semantic Kernel 入门系列:📅 Planner 规划器 https://www.cnblogs.com/xbotter/p/semantic_kernel_introduction_planner.html 本文介绍了Semantic Kernel的一个核心能力,即实现目标

再谈http请求调用(Post与Get),项目研发的核心一环

支持.Net Core(2.0及以上)与.Net Framework(4.0及以上) 【目录】 前言 Post请求 Get请求 与其它工具的比较 1【前言】 http请求调用是开发中经常会用到的功能。 在内,调用自有项目的Web Api等形式接口时会用到;在外,调用一些第三方功能接口时,也会用到,因

C#反射

目录C#反射概述语法应用场景总结引用 C#反射 概述 C# 反射(Reflection)是一种强大的机制,它允许程序在运行时访问和操作 .NET 程序集中的类型和成员。 获取程序集、模块 和类型成员信息,三者关系介绍请查看。 语法 反射的核心概念是 Type 对象。Type 对象表示一个 .NET

创建.NET程序Dump的几种姿势

当一个应用程序运行的有问题时,生成一个Dump文件来调试它可能会很有用。在Windows、Linux或Azure上有许多方法可以生成转储文件。 Windows平台 dotnet-dump (Windows) dotnet-dump全局工具是一种收集和分析.NET核心应用程序Dump的方法。 安装 d

揭秘 .NET 中的 TimerQueue(上)

[TOC] # 前言 TimerQueue 是.NET中实现定时任务的核心组件,它是一个定时任务的管理器,负责存储和调度定时任务。它被用于实现很多 .NET 中的定时任务,比如 System.Threading.Timer、Task.Delay、CancellationTokenSource 等。

.NET周刊【7月第3期 2023-07-16】

## 国内文章 ### 揭秘 .NET 中的 TimerQueue(上) https://www.cnblogs.com/eventhorizon/p/17557821.html TimerQueue 是.NET中实现定时任务的核心组件,它是一个定时任务的管理器,负责存储和调度定时任务。它被用于实现

[转帖]sql server 2016不能全部用到CPU的逻辑核心数的问题

https://blog.csdn.net/u011966339/article/details/122969685 最近在工作中遇到了,sql server 2016 不能把CPU 的核心全部用到的问题.通过分析工具看到 总共CPU核心有72核,但sql 只能用到40核心,想信也有很多人遇到这问题

[转帖]Redis 核心篇:唯快不破的秘密

文章系转载,方便整理和归纳,源文地址:https://z.itpub.net/article/detail/4B5A03BDDBE9A2BC3E080E278FE4D21E 以下文章来源于码哥字节 ,作者MageByte技术团队 学习一个技术,通常只接触了零散的技术点,没有在脑海里建立一个完整的知识