前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET GC 精要(六)

.NET GC 精要(六)

作者头像
用户2615200
发布2020-02-17 10:18:31
4140
发布2020-02-17 10:18:31
举报

本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management

(注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等)

深入
内存段(memory segment)的申请

每个托管进程(managed process)都有各自独立的 SOH 和 LOH,并且在开始执行的时候,托管进程会为 SOH 和 LOH 各自申请一个内存段.

对于 SOH 而言,托管进程开始执行时为其申请的内存段称为临时段(ephemeral segment),用于分代对象的申请(Gen 0 对象的申请)和提升(Gen 0 提升至 Gen 1, Gen 1 提升至 Gen 2),当后续 Full GC (即 Gen 2 回收)发生的时候,GC 流程会另外申请一个内存段(新的临时段),之前流程中遍历标记的 Gen 0 对象会被统一复制到该内存段中,并被提升为 Gen 1 对象(因为经历了一次 GC 检查,更多细节可以看之前的介绍),而遍历标记的其他对象(Gen 1 对象和 Gen 2 对象)则统一作为 Gen 2 对象保留在之前的内存段(旧的临时段)中,示意图如下:

(Object H 和 Object I 被复制到了新的临时段中,并被提升为 Gen 1 对象,其他对象统一作为 Gen 2 对象保留在旧的临时段中)

GC 模式
  • 工作站(Workstation)模式

该模式用以最大化程序的响应能力(responsiveness),方法上就是尽可能的限制 GC 引起的程序停顿,该模式支持 并发非并发 两种执行模式(并发执行模式为默认的执行模式),一般适用于客户端程序.

  • 服务器(Server)模式

该模式用以最大化程序的吞吐量(throughput),方法上则是为每个逻辑处理器分配独立的 SOH 和 LOH, 后续的 GC 流程就可以在各个逻辑处理器上并发执行了(当然相关的内存段大小和分代阈值相比工作站模式也会更大),该模式一般适用于服务器程序.

配置方式

GC 模式可以在程序的 config 文件中进行配置,示例如下:

配置 工作站模式

代码语言:javascript
复制
<configuration>
    <runtime>
        <gcServer enabled="false"/>
    </runtime>
</configuration>

配置 服务器模式

代码语言:javascript
复制
<configuration>
    <runtime>
        <gcServer enabled="true"/>
    </runtime>
</configuration>

如果你配置了工作站模式,则可以进一步配置其执行模式(并发非并发)

配置 并发(工作站模式下)

代码语言:javascript
复制
<configuration>
    <runtime>
        <gcConcurrent enabled="true"/>
    </runtime>
</configuration>

配置 非并发(工作站模式下)

代码语言:javascript
复制
<configuration>
    <runtime>
        <gcConcurrent enabled="false"/>
    </runtime>
</configuration>

值得一提的是,如果你在服务器模式下进行上述(gcConcurrent)配置是没有效果的.

未完待续(to be continued)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 深入
    • 内存段(memory segment)的申请
      • GC 模式
        • 配置方式
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档