首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在.net clr源代码中维护局部变量使用信息

如何在.net clr源代码中维护局部变量使用信息
EN

Stack Overflow用户
提问于 2015-05-23 19:03:19
回答 1查看 262关注 0票数 5

这个伟大的答案解释了GC如何能够在方法完成执行之前收集局部变量:

当将用于方法的IL编译为机器代码时,抖动执行两项重要任务。.,它还生成一个表,该表描述如何使用方法主体中的局部变量。该表为每个方法参数和带有两个地址的局部变量提供了一个条目。变量将首先存储对象引用的地址。以及不再使用该变量的机器代码指令的地址。.表中的“不再使用”地址非常重要。这使得垃圾收集器非常高效。它可以收集对象引用,即使它在方法中使用,而且该方法还没有完成的执行。

我很好奇JIT如何创建内部表,以及如何在真正的clr源代码中维护“不再使用”地址。有人能在最近开源的核心程序源代码中向我展示相关的代码片段吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-27 11:39:40

免责声明:我不是CLR或RyuJIT方面的专家。这一切我可能完全错了。

我在“部分 of RyuJIT章 of 运行时之书”中看到了下面的运行时之书

对于具有跟踪生存期的lvlVars,或者对于涉及GC引用的表达式,我们报告引用活动的范围。这是由发射器完成的,它将此信息添加到指令组,并在GC信息更改时终止指令组。

jit/jitgcinfo.h中可以找到存储此信息的结构,如下所示:

代码语言:javascript
复制
struct varPtrDsc
{
    varPtrDsc   *   vpdNext;

    unsigned        vpdVarNum;         // which variable is this about?

    unsigned        vpdBegOfs ;        // the offset where life starts
    unsigned        vpdEndOfs;         // the offset where life starts
};

上面我引用的段落表明,这些字段都是由“发射器”填充的,我认为它们指的是jit/emit.cpp

生存期间隔的开始在emitter::emitGCvarLiveSet()中设置;相关的节选是(为了简洁而消除空白):

代码语言:javascript
复制
/* Allocate a lifetime record */
desc = new (emitComp, CMK_GC) varPtrDsc;
desc->vpdBegOfs = emitCurCodeOffs(addr);
#ifdef DEBUG
desc->vpdEndOfs = 0xFACEDEAD;
#endif
desc->vpdVarNum = offs;
desc->vpdNext = NULL;

生命周期的结束以类似的方式在emitter::emitGCvarDeadSet()中设置。

代码语言:javascript
复制
/* Record the death code offset */
assert(desc->vpdEndOfs == 0xFACEDEAD);
       desc->vpdEndOfs  = emitCurCodeOffs(addr);

最后,表似乎是用jit/gcencode.cpp编写的,特别是用GCInfo::gcMakeVarPtrTable()编写的。

希望这将作为一个起点,如果您想进一步探讨。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30416520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档