.NET GC 精要(六)

49 篇文章 1 订阅

本文讲述了 .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 文件中进行配置,示例如下:

配置 工作站模式

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

配置 服务器模式

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

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

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

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

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

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

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

未完待续(to be continued)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值