详谈 .NET Core GC 工作模式

GC 是什么

GC(garbage collection)是对内存管理中回收已经不用的内存的一种机制,java 和 .net 都有自己的 GC 机制,是内存管理的一部分。

为什么会有 GC

因为动态的内存分配和分布操作系统是不管的,得各类语言自己实现,例如 c 和 c++ 自己需要手动管理分配的内存资源,如果不手动释放,那么会造成已经无用的内存不能被操作系统识别使用,也就是所谓的内存泄漏。

.NET 的 GC 都是发生在堆(heap),因为这个动态的内存是在堆上分配的。为什么 .net 没有像 c++ 一样提供手动管理内存的操作?因为手工管理内存非常容易出问题,开发人员不应花费时间在这个上面,避免人为问题,就找一个管理内存的“人”来,处理这些事情,于是 GC 就出现了。

GC 工作模式

.NET Core GC 有两种模式 Server GC、Workstation GC

<ConcurrentGarbageCollection>true</ConcurrentGarbageCollection> = Server GC
<ConcurrentGarbageCollection>false</ConcurrentGarbageCollection> = Workstation GC

Server GC

主要应用于多处理器系统,并且作为 ASP.NET Core 宿主的默认配置。它会为每个处理器都创建一个 GC Heap,并且会并行执行回收操作。该模式的 GC 可以最大化吞吐量和较好的收缩性。这种模式的特点是初始分配的内存较大,并且尽可能不回收内存,进行回收用时会很耗时,并进行内存碎片整理工作。

Workstation GC

主要应用于单处理器系统,Workstation GC 尽可能地通过减少垃圾回收过程中程序的暂停次数来提高性能。低负载且不常在后台(如服务)执行任务的应用程序,可以在禁用并发垃圾回收的情况下使用工作站垃圾回收。特点是会频繁回收,来阻止一次较长时间的回收。

Concurrent GC

Concurrent GC 是一种 GC 的工作方式,如果是单处理器的机器,即便配置了 Concurrent 选项为 True,也不会生效。Server GC 和 Workstation GC 都可以开启 Concurrent GC,在 GC 回收的过程中大部分时间用户线程可以并发运行。但只能影响到 2 代对象 GC 的过程,因为 0 代 1 代的时间太短了。

Workstation ,Server GC 模式区别

  • Workstation GC:这么说吧,它非常的保守的进行内存什么的管理,有点像守财奴,一点点的申请,所以 GC 申请内存小点。
  • Server GC:就是那种暴发户,往大了申请内存,越多越好,所以可以预见到 Server GC 模式下,内存耗费是非常惊人的,在查找资料的时候有人在 docker 中运行 .net core 的程序,占用内存太大了被重启,改了 workstation gc 后内存就大幅下降。

.NET Core GC的几种配置模式

Concurrent & Workstation GC

<ServerGarbageCollection>false</ServerGarbageCollection>
<ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>

特点:在吞吐量和相应速度上寻找平衡点,,GC Heap 数量为1,GC threads 在分配空间的线程,GC 线程优先权和工作线程具有相同的优先权,工作线程(非 GC 线程)会因为 GC 工作过程中短暂多次挂起。

Background & Workstation GC

<ServerGarbageCollection>false</ServerGarbageCollection>
<ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>

特点:最大化吞吐量并优化 gen2 GC 性能, GC Heap 数量为1,background GC 线程与工作线程有相同优先级,但都低于前台 GC 线程 ,工作线程(非 GC 线程)会因为 GC 工作过程中短暂多次挂起,较并发性能更加(针对 Gen2 的)。

Concurrent & Server GC

<ServerGarbageCollection>true</ServerGarbageCollection>
<ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>

特点:多处理器机器上使用多线程处理相同类型的请求以便最大化服务程序吞吐量, GC Heap 数量为每处理器1个,每个处理器都有一个专职的 GC 线程,GC 线程拥有最高线程的优先级,工作线程(非 GC 线程)会因为 GC 工作过程中会被挂起。

Background & Server GC

<ServerGarbageCollection>true</ServerGarbageCollection>
<ConcurrentGarbageCollection>false</ConcurrentGarbageCollection>

特点:在 Concurrent & Server GC 基础上优化 gen2 GC 性能, GC Heap 数量为每处理器1个,每个处理器都有一个专职的 GC background 线程,background GC 线程与工作线程有相同优先级,但都低于前台 GC线程,工作线程(非 GC 线程)会因为 GC 工作过程中短暂多次挂起,较并发性能更加(针对 Gen2 的)ephemeral generation 的前台 GC 工作时会挂起其他所有线程。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟厚非

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值