.net主要有两种类型垃圾回收器,也可也说是垃圾回收器的两种工作模式。

GC的类型主要有两种;

工作模式是针对进程的,程序启动后就不能修改了。只能在配置文件.json .xml进行设置。但是可用通过GCSeting类的GCLatencyMode进行微调(也叫延迟模式)。

  • 工作站(默认的.NET程序都是WorkStation GC)
  • 服务器 (默认的.NET程序都是WorkStation GC)

GC的工作方式主要有两种

每种类型都对应两种工作方式

  • 后台(.net4.0后用后台模式取代并发模式)
  • 非并发

工作站和服务器垃圾回收

使用条件:进程终止前不会改变,不过可用通过GCsetting类的GClatencyMode进行控制。

工作站
该模式针对客户端应用程序优化GC.GC造成的延时很低,应用程序线程挂起时间很短,避免使用户感到焦虑。在该模式中,GC假定机器上运行的其他应用程序都不会消耗太多的CPU资源。

工作站垃圾回收既可以是并发的,也可以是非并发的。 并发(或后台 )垃圾回收使托管线程能够在垃圾回收期间继续操作。 后台垃圾回收替换 .NET Framework 4 及更高版本中的并行垃圾回收
服务器

该模式针对服务器端应用程序优化GC。被优化的主要是吞吐量资源利用。GC假定机器上没有运行其他应用程序(无论客户端还是服务器应用程序),并假定机器的所有CPU都可用来辅助完成GC。该模式造成托管堆被拆分成几个区域(section),每个CPU一个。开始垃圾回收时,垃圾回收器在每个CPU上都运行一个特殊线程;每个线程都和其他线程并发回收它自己的区域。对于工作者线程(worker

thread)行为一致的服务器应用程序,并发回收能很好地进行。这个功能要求应用程序在多CPU计算机上运行,使线程能真正地同时工作,从而获得性能的提升。

  • 在 .NET Core 中,服务器垃圾回收既可以是非并发也可以是后台执行。

  • 在 .NET Framework 4.5 和更高版本中,服务器垃圾回收既可以是非并发也可以是后台执行。 在 .NET Framework 4 和以前的版本中,服务器垃圾回收非并行运行

应用程序默认以“工作站”GC模式运行。寄宿了CLR的服务器应用程序(比如ASP.NET或Microsoft SQL Server)可请求CLR加载“服务器”GC.但如果服务器应用程序在单处理器计算机上运行,CLR将总是使用“工作站"GC模式。

独立应用程序可创建一个配置文件告诉CLR使用服务器回收器。配置文件要为应用程序添加一个gcServer元素。下面是一个示例配置文件:

.net core 在.csproj 文件中添加

<PropertyGroup>
<ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>

.net frame

<configuration>
<runtime>
<gcServer enabled="true"/>
</runtime>
</configuration>

应用程序运行时,可查询GCSettings类的只读Boolean属性IsServerGC来询问CLR它是否正在“服务器”GC模式中运行:

using System;
using System.Runtime; // GCSettings is in this namespace public static class Program {
public static void Main() {
Console.WriteLine("Application is running with server GC=" + GCSettings.IsServerGC);
}
}

除了这两种主要模式,GC还支持两种子模式:并发(默认)或非并发。

在并发方式中,垃圾回收器有一个额外的后台线程,它能在应用程序运行时并发标记对象。一个线程因为分配对象造成第0代超出预算时,GC首先挂起所有线程,再判断要回收哪些代。
事实上,垃圾回收器更倾向于选择不压缩。可用内存多,垃圾回收器便不会压缩堆;这有利于增强性能,但会增大应用程序的工作集。

为了告诉CLR不要使用并发回收器,可创建包含geConcurrent元素的应用程序配置文件。下面是配置文件的一个例子:

<configuration>
<runtime>
<gcConcurrent enabled="false"/>
</runtime>
</configuration>

配置

后台/非并发配置

  • 配置是否启用后台(并发)垃圾回收。
  • 默认:使用后台垃圾回收。 它等效于将值设置为 true
  • 有关详细信息,请参阅后台垃圾回收
后台垃圾回收
  设置名 引入的版本
runtimeconfig.json System.GC.Concurrent true - 后台 GC
false - 非并发 GC
.NET Core 1.0
MSBuild 属性 ConcurrentGarbageCollection true - 后台 GC
false - 非并发 GC
.NET Core 1.0
环境变量 COMPlus_gcConcurrent 1 - 后台 GC
0 - 非并发 GC
.NET Core 1.0
环境变量 DOTNET_gcConcurrent 1 - 后台 GC
0 - 非并发 GC
.NET 6
.NET Framework 的 app.config gcConcurrent true - 后台 GC
false - 非并发 GC

示例

runtimeconfig.json 文件:

{
"runtimeOptions": {
"configProperties": {
"System.GC.Concurrent": false
}
}
}

项目文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
<ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>
</PropertyGroup> </Project>

案例 .net6.0 C#10

using System.Runtime;
//查看GC的初始配置:类型、工作方式以及微调工作方式。 类型、工作方式在.json或xml文件中修改。不过可用在程序运行时候微调
Console.WriteLine($"IsServerGC:{GCSettings.IsServerGC}");// 释放是服务器GC
Console.WriteLine($"IsConcurrent:{System.GC.GetGCMemoryInfo().Concurrent}");//工作方式 System.GC
Console.WriteLine($"LatencyMode:{GCSettings.LatencyMode}");// 微调工作方式状态 Console.WriteLine("GC的工作方式进行微调 将默认的模式修改成Batch");
GCLatencyMode oldGCL=GCSettings.LatencyMode;//获取单曲的GC
try
{
GCSettings.LatencyMode = GCLatencyMode.Batch;
//要执行其他代码
}
finally
{
//修改回去
GCSettings.LatencyMode=oldGCL;
}
GCSettings.LatencyMode = GCLatencyMode.Batch;
Console.WriteLine($"IsConcurrent:{System.GC.GetGCMemoryInfo().Concurrent}");// //System.GC
Console.WriteLine($"LatencyMode:{GCSettings.LatencyMode}");// 工作方式

【C# .Net GC】GC的类型与工作方式 和配置的更多相关文章

  1. (转)什么是.NET?什么是CLI?什么是CLR?IL是什么?JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式?

    转自:http://www.cnblogs.com/haofaner/articles/2288968.html 1:什么是.NET? NET 是 Microsoft 的用以创建 XML Web 服务 ...

  2. 垃圾回收(GC)的三种基本方式

    垃圾(Garbage)就是程序需要回收的对象,如果一个对象不在被直接或间接地引用,那么这个对象就成为了「垃圾」,它占用的内存需要及时地释放,否则就会引起「内存泄露」.有些语言需要程序员来手动释放内存( ...

  3. UE4 中Struct Emum 类型的定义方式 笔记

    UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...

  4. NIO的工作方式

    BIO带来的挑战 BIO 就是我们常说的阻塞I/O , 不论磁盘I/O 还是网络/O ,数据在写入OutputStream 或者从 InutStream 读取数据时都有可能会阻塞,一旦有了阻塞,线程就 ...

  5. Buffer的工作方式

    1.Buffer的工作方式 前面<java NIO的工作方式>介绍了Selector检测到通信信道I/O有数据传输时,通过select()方法取得SocketChannel,将数据读取或写 ...

  6. NIO 的工作方式

    NIO 的工作方式 BIO 带来的挑战 BIO : BIO 通信模型,通常由一个独立的 Acceptor 线程负责监听客户端的连接,接受到请求之后,为每个客户端创建一个新的线程进行链路处理,处理完成之 ...

  7. dicom通讯的工作方式及dicom标准简介

    本文主要讲述dicom标准及dicom通讯的工作方式.dicom全称医学数字图像与通讯 其实嘛就两个方面 那就是“存储”跟“通讯”. 文件数据组织方式  网络数据组织方式.文件数据组织方式就是解析静态 ...

  8. MVC4 WebAPI(二)——Web API工作方式

    http://www.cnblogs.com/wk1234/archive/2012/05/07/2486872.html 在上篇文章中和大家一起学习了建立基本的WebAPI应用,立刻就有人想到了一些 ...

  9. 思考的工作方式——计划经济or市场经济

    背景:单位成立了技术领先的基础部门.专注于产品规划的技术解决方案部门.产品的发展规划方向.批准的项目和各部门的其他工作方案.工作内容是在这一领域没有问题.毕竟,从过去企业发展的一个部门模型现在是一个功 ...

随机推荐

  1. 事务与一致性:刚性or柔性

    转发自 https://cloud.tencent.com/developer/article/1038871 在高并发场景下,分布式储存和处理已经是常用手段.但分布式的结构势必会带来"不一 ...

  2. golang中int、float、string数据类型之间的转换

    package main import ( "fmt" "strconv" ) func main() { var num1 int = 88 var num2 ...

  3. java-导入import

    1 package face_package; 2 3 import face_packagedemoA.DemoA; 4 import face_packagedemoB.DemoB; 5 //真正 ...

  4. 集合框架-Map重点方法entrySet演示

    1 package cn.itcast.p6.map.demo; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 import ...

  5. Mac系统之U盘重装(降级)

    U盘重装mac系统步骤如下 1. 将Mac系统U盘插上电脑,按下Mac开机键后,摁住"option"键不放,稍等几秒会出现启动盘选择界面,选择"安装 macOS" ...

  6. json模块 os模块 文件加密

    目录 一:random随机模块 二:os模块 三:文件处理选择任意视频 四:sys模块 五:实现文件执行加密操作 六:json 序列化模块 七:json序列化 反序列化 八:json 文件写读方式 九 ...

  7. python列表删除和排序

    1.del message[0]---知道位置不知道值 2.message.remove('a')----知道值不知道位置 3.message.sort()--正向永久排序 4.message.sor ...

  8. Vue3源码分析之微任务队列

    参考资料:https://zh.javascript.info/microtask-queue#wei-ren-wu-dui-lie-microtaskqueue 简化版 Vue3 中的 微任务队列实 ...

  9. Java中的常用的输入输出流

    Java中的输入输出流根据格式又可以分为字节流和字符流:(成对) 字节流:FileInputStream,FileOutputStream   :  BufferedInputStream,Buffe ...

  10. Redis 哨兵模式

    主从切换技术的方法是:当主服务器宕机了,需要手动将一台从服务器切换为主服务器,这就需要人工干预,这可能会造成一段时间的服务不可用. 一.哨兵模式的概述: 哨兵是一个独立的进程,作为一个进程,他会独立地 ...