专栏首页知识累积.NET Core 配置GC工作模式与内存的影响

.NET Core 配置GC工作模式与内存的影响

.NET Core 配置GC工作模式与内存的影响

.NET Core

GC

原文:https://blog.markvincze.com/troubleshooting-high-memory-usage-with-asp-net-core-on-kubernetes/ 译文:https://www.csharpkit.com/2017-11-13_50283.html


对GC工作模式的分类

.NET Core 两种GC模式:

Server GC / Workstation GC Server GC :

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

Workstation GC :

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

Concurrent GC 工作方式 :

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

ASP.NET Core Project GC配置:

ASP.NET CORE项目中,通过System.GC.Server配置进行GC模式设置,创建项目默认的GC模式是: System.GC.Server : true (Server GC Concurrent Mode) 每CPU分配GC ;System.GC.Server : false (Workstation GC Concurrent mode),且Concurrent=1。

GC 内存分配原则:

GC heap用于保存0、1、2代的对象时,需要向系统申请时的基本单位是Segment,系统会分配指定值大小的Segment用于存储对象,这些值会随着程序的实际执行情况,由GC动态调整。正是由于有Segment的概念所以回出现内存碎片的问题,所以GC在垃圾回收过程中会进行内存整理,以减少内存碎片提高内存使用率。
    Segment的大小取决于系统是32位还是64位,以及它正在运行的垃圾收集器的类型,下表列出了分配时系统所使用的默认值:

1536125938713.jpg

Segment包括第2代对象,第2代对象会在内存允许的情况尽可能多的申请到内存,并使用多个段进行内存存储。
从GC中释放的内存量仅限于Segment的大小,但由于Segment采用动态大小进行了分配,这就使得释放后的大量内存占位导致内存使用率低下,前面也说过了,为了解决这个问题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>

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工作时会挂起其他所有线程。

GC几种模式的分析 (参考资料):

https://blogs.msdn.microsoft.com/seteplia/2017/01/05/understanding-different-gc-modes-with-concurrency-visualizer/ https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals https://github.com/aspnet/Home/issues/2056

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 前端插件使用记录

    喝茶去
  • 单元测试规范

    举个例子,现在要对Shape.Core.dll中的Line类的Contains方法写单元测试,测试其在传入一个当前直线上的点时,能正确返回true,按照规范应该...

    喝茶去
  • C#各种委托介绍

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。

    喝茶去
  • JVM系列第10讲:垃圾回收的几种类型

    我们经常会听到许多垃圾回收的术语,例如:Minor GC、Major GC、Young GC、Old GC、Full GC、Stop-The-World 等。但...

    陈树义
  • 成为JavaGC专家(1)—深入浅出Java垃圾回收机制

    对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用...

    哲洛不闹
  • [三步法] 可视化分析定位线上 JVM 问题

    前提是线上 JVM 配置了以下参数: [题外话:JDK 版本 1.6,现在大部分互联网企业应用系统应该是 1.8 以上了吧 ]

    IT技术小咖
  • 程序员如何优化 Java GC

    本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作。

    黄泽杰
  • Full GC 和 Minor GC,傻傻分不清楚

    大家可能见到过很多的 GC 名词,比如:Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC。

    武培轩
  • 经典面试题

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    cwl_java
  • 从ASP.NET Core 3.0 preview 特性,了解CLR的Garbage Collection

    在阅读这篇文章:Announcing Net Core 3 Preview3的时候,我看到了这样一个特性:

    ShenduCC

扫码关注云+社区

领取腾讯云代金券