8

.NET GC 精要(六)

 3 years ago
source link: https://blog.csdn.net/tkokof1/article/details/104192232
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
.NET GC 精要(六)_tkokof1的专栏-CSDN博客

本文讲述了 .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 对象保留在旧的临时段中)

  • 工作站(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)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK