今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔。下面我们继续:

    // Initialize free object methodtable. The GC uses a special array-like methodtable as placeholder
// for collected free space.
// //初始化释放器(对象方法表),<-不知道翻译得对不对。
//GC使用一个很特别的像数组的methodtable作为占位符收集空闲空间
static MethodTable freeObjectMT;

  那么这个MethodTable到底是“何方神圣”呢?下面只列出了部分的方法;

class MethodTable
{
public:
uint16_t m_componentSize; //容器大小
uint16_t m_flags; //标识符
uint32_t m_baseSize; //初始(最小大小,反正我是这么理解的) MethodTable * m_pRelatedType; //关联类型,是一个MethodTable类型的指针 public:
void InitializeFreeObject() //初始化“空闲”对象
{
//void(*)科普↓↓↓↓
//http://www.zhihu.com/question/24398191?sort=created
m_baseSize = 3 * sizeof(void *);
m_componentSize = 1;
m_flags = 0;
} uint32_t GetBaseSize()
{
return m_baseSize;
} uint16_t RawGetComponentSize()
{
return m_componentSize;
}
}

  下面我们再回到GCSample.cpp文件,其中得到的初始化的空间赋给了一个叫做g_pFreeObjectMethodTable的指针,这是为什么呢?

	//初始化
freeObjectMT.InitializeFreeObject(); //不知道为什么要赋给它
g_pFreeObjectMethodTable = &freeObjectMT;

  下面来看一下这个方法,我并不知道它说的handle table是何物,所以这里还需要继续探索。

	// 初始化handle表(“引用”是否初始化)
if (!Ref_Initialize())
return -1;

  我们来看看Ref_Initialize()这个方法,我打算一步步分解这个方法,我们首先注意到CONTRACTL和 CONTRACTL_END,这2个宏其实是定义在gcenv.base.h中的,也就是说,从这个定义当中,我们获取到了一个有用的信息:它是GC环境变量的一部分,在不同的CPU或者系统的机器上,我敢大胆的预测,他们都会从dynamic->具体的值。

  

//协议开始(暂时都这么说,只是猜测)
  CONTRACTL
  {
  NOTHROW;//同 NO - THROW
  WRAPPER(GC_NOTRIGGER); //同 NO -TRIGGER
  INJECT_FAULT(return false); //如果注入失败,那么直接返回FALSE
  }
  CONTRACTL_END; //协议结束

  我们再来看如下的代码,是不是有种无从下手的感觉?那么我就带你来进行一番解析吧。

    // sanity
_ASSERTE(g_HandleTableMap.pBuckets == NULL);

  从下图当中,完全已经详细的标注了编译器寻找代码的过程,关于assert的一些文字,大家可以自行百度。

关于g_HandleTableMap,由于篇幅和时间有限,我这里只讲一下和g_HandleTableMap.pBuckets有关的代码,余下的,如果各位有兴趣的,可以自己研究 ~下面图中显示了pBuckets的真容。

其实可以这么说,它的内部是一个HandleTableBucket,下面是它的代码,当然我我没有讲全,而且,我的外语水平很烂,将就看吧。

// struct containing g_SystemInfo.dwNumberOfProcessors HHANDLETABLEs and current table index
// instead of just single HHANDLETABLE for on-fly balancing while adding handles on multiproc machines //结构体包含了gc系统信息dw进程(PTR_HHANDLETABLE),以及当前table的下标
//这里要说起来很复杂,反正简单点理解,就是一个Dataset,懂了吧;
struct HandleTableBucket
{
PTR_HHANDLETABLE pTable;
uint32_t HandleTableIndex; bool Contains(OBJECTHANDLE handle);
};

  

C++随笔:.NET CoreCLR之GC探索(4)的更多相关文章

  1. C++随笔:.NET CoreCLR之GC探索(3)

    有几天没写GC相关的文章了哈,今天我讲GC的方式是通过一个小的Sample来讲解,这个小的示例代码只有全部Build成功了才会有.地址为D:\coreclr2\coreclr\bin\obj\Wind ...

  2. C++随笔:.NET CoreCLR之GC探索(2)

    首先谢谢 @dudu 和 @张善友 这2位大神能订阅我,本来在写这个系列以前,我一直对写一些核心而且底层的知识持怀疑态度,我为什么持怀疑态度呢?因为一般写高层语言的人99%都不会碰底层,其实说句实话, ...

  3. C++随笔:.NET CoreCLR之GC探索(1)

    一直是.NET程序员,但是.NET的核心其实还是C++,所以我准备花 一点时间来研究CoreCLR和CoreFX.希望这个系列的文章能给大家带来 帮助. GC的代码有很多很多,而且结构层次对于一个初学 ...

  4. CoreCLR源码探索(五) GC内存收集器的内部实现 调试篇

    在上一篇中我分析了CoreCLR中GC的内部处理, 在这一篇我将使用LLDB实际跟踪CoreCLR中GC,关于如何使用LLDB调试CoreCLR的介绍可以看: 微软官方的文档,地址 我在第3篇中的介绍 ...

  5. CoreCLR文档翻译 - GC的设计

    此文档来源于CoreCLR的BOTR(The Book of the Runtime), 点击打开原文 一切著作权归微软公司所有 GC的设计 作者: Maoni Stephens (@maoni0) ...

  6. CoreCLR源码探索(三) GC内存分配器的内部实现

    在前一篇中我讲解了new是怎么工作的, 但是却一笔跳过了内存分配相关的部分. 在这一篇中我将详细讲解GC内存分配器的内部实现. 在看这一篇之前请必须先看完微软BOTR文档中的"Garbage ...

  7. CoreCLR源码探索(四) GC内存收集器的内部实现 分析篇

    在这篇中我将讲述GC Collector内部的实现, 这是CoreCLR中除了JIT以外最复杂部分,下面一些概念目前尚未有公开的文档和书籍讲到. 为了分析这部分我花了一个多月的时间,期间也多次向Cor ...

  8. CoreCLR源码探索(一) Object是什么

    .Net程序员们每天都在和Object在打交道 如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" 这个答案是对的 ...

  9. CoreCLR源码探索(二) new是什么

    前一篇我们看到了CoreCLR中对Object的定义,这一篇我们将会看CoreCLR中对new的定义和处理 new对于.Net程序员们来说同样是耳熟能详的关键词,我们每天都会用到new,然而new究竟 ...

随机推荐

  1. C# 发送邮件 附件名称为空

     示例代码: // 1.创建邮件 MailMessage mailMsg = new MailMessage(); mailMsg.To.Add(new MailAddress("test@ ...

  2. [C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

    剖析 AssemblyInfo.cs - 了解常用的特性 Attribute [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5944391.html 序 ...

  3. 【Machine Learning】Python开发工具:Anaconda+Sublime

    Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...

  4. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  5. 装饰者模式 Decoration

    1.什么是装饰者模式 动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活.当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列 ...

  6. C 盘的不速之客

      C 盘的报告内容既然上GB的空间 操作系统版本 原来是微软这个查找解决异常关闭解决方案生成的报告   参考 How To Disable Vista Error Reporting Feature ...

  7. web安全浅析

    就之前本人主持开发的金融产品所遇到的安全问题,设计部分请参见:http://www.cnblogs.com/shenliang123/p/3835072.html 这里就部分web安全防护就简单的交流 ...

  8. JS高级前端开发群加群说明及如何晋级

    JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明:   一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这 ...

  9. web前端开发分享-目录

    1. web前端开发分享-css,js入门篇 2. web前端开发分享-css,js进阶篇 3. web前端开发分享-css,js提高篇 4. web前端开发分享-css,js工具篇 5. web前端 ...

  10. asp.net中ashx生成验证码代码放在Linux(centos)主机上访问时无法显示问题

    最近有个项目加入了验证码功能,就从自己博客以前的代码中找到直接使用,直接访问验证码页面报错如下: 源代码:asp.net中使用一般处理程序生成验证码 Application Exception Sys ...