前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CLR跨代标记内存模型

CLR跨代标记内存模型

作者头像
江湖评谈
发布2023-10-26 17:58:13
1400
发布2023-10-26 17:58:13
举报
文章被收录于专栏:天下风云天下风云

CLR深度结构内存模型,主要是跨代引用。用以描述老年代引用新生代(短暂堆)里面的对象范围。

1.GCDesc GC对象内存范围操作结构模型

代码语言:javascript
复制
class CGCDesc
{
    CGCDesc () {}
}

可以看到它里面只有一个默认构造函数。

2.CGCDescSeries GC对象内存范围描述结构模型

代码语言:javascript
复制
class CGCDescSeries
{
public:
    union
    {
        size_t seriessize;
        val_serie_item val_serie[1];
    };
    size_t startoffset;
}

一个共用体和一个八字节的成员变量。

3.card_table 位标记描述表,它是一块二进制内存,用十六进制表示

代码语言:javascript
复制
0x7fffffff44444444 ffffffffffffffff ffffffffffffffff
                   ffffffffffffffff ffffffffffffffff
                   ffffffffffffffff 00000000000000ff

比如n1.selfName= n2会用JIT_WriteBarrier设置0xff,也即是上面的

代码语言:javascript
复制
00000000000000ff

4.整体

card_table确认老年代里面包含了引用新生代(短暂堆)的对象,遍历card_table查找出这个范围。然后遍历这个范围,找到老年代引用的新生代对象,对它的MethodTable最后一位标记存活。 这里的找到老年代引用的新生代对象,需要借助GCDesc和CGCDescSeries,它们的大致内存模型如下,某个对象的地址0x000001E0F5043F28,00007fff4a423448是MT.

代码语言:javascript
复制
0x000001E0F5043F28  00007fff4a423448

它的MT如下:

代码语言:javascript
复制
0x00007FFF4A423448  0000002001000000 0000000400080080 00007fff4a423338 00007fff49ab6110 00007fff49e3dc88

从它MT-0x20start=开始:

代码语言:javascript
复制
0x00007FFF4A423420  00007fffa956d5f8 0000000000001b78 fffffffffffffff0 0000000000000008 0000000000000001
0x00007FFF4A423448  0000002001000000 0000000400080080 00007fff4a423338 00007fff49ab6110 00007fff49e3dc88

看内存,此时计算范围公式是:

代码语言:javascript
复制
start=0x000001E0F5043F28+*(uint64_t*)(0x00007FFF4A423448-0x10);
end  =start+*(uint64_t*)(0x00007FFF4A423448-0x18)+8;

在star和end之间寻找老年代引用的新生代对象,然后对它进行标记。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江湖评谈 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档