C++随笔:.NET CoreCLR之GC探索(4)
今天继续来 带大家讲解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)的更多相关文章
- C++随笔:.NET CoreCLR之GC探索(3)
有几天没写GC相关的文章了哈,今天我讲GC的方式是通过一个小的Sample来讲解,这个小的示例代码只有全部Build成功了才会有.地址为D:\coreclr2\coreclr\bin\obj\Wind ...
- C++随笔:.NET CoreCLR之GC探索(2)
首先谢谢 @dudu 和 @张善友 这2位大神能订阅我,本来在写这个系列以前,我一直对写一些核心而且底层的知识持怀疑态度,我为什么持怀疑态度呢?因为一般写高层语言的人99%都不会碰底层,其实说句实话, ...
- C++随笔:.NET CoreCLR之GC探索(1)
一直是.NET程序员,但是.NET的核心其实还是C++,所以我准备花 一点时间来研究CoreCLR和CoreFX.希望这个系列的文章能给大家带来 帮助. GC的代码有很多很多,而且结构层次对于一个初学 ...
- CoreCLR源码探索(五) GC内存收集器的内部实现 调试篇
在上一篇中我分析了CoreCLR中GC的内部处理, 在这一篇我将使用LLDB实际跟踪CoreCLR中GC,关于如何使用LLDB调试CoreCLR的介绍可以看: 微软官方的文档,地址 我在第3篇中的介绍 ...
- CoreCLR文档翻译 - GC的设计
此文档来源于CoreCLR的BOTR(The Book of the Runtime), 点击打开原文 一切著作权归微软公司所有 GC的设计 作者: Maoni Stephens (@maoni0) ...
- CoreCLR源码探索(三) GC内存分配器的内部实现
在前一篇中我讲解了new是怎么工作的, 但是却一笔跳过了内存分配相关的部分. 在这一篇中我将详细讲解GC内存分配器的内部实现. 在看这一篇之前请必须先看完微软BOTR文档中的"Garbage ...
- CoreCLR源码探索(四) GC内存收集器的内部实现 分析篇
在这篇中我将讲述GC Collector内部的实现, 这是CoreCLR中除了JIT以外最复杂部分,下面一些概念目前尚未有公开的文档和书籍讲到. 为了分析这部分我花了一个多月的时间,期间也多次向Cor ...
- CoreCLR源码探索(一) Object是什么
.Net程序员们每天都在和Object在打交道 如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" 这个答案是对的 ...
- CoreCLR源码探索(二) new是什么
前一篇我们看到了CoreCLR中对Object的定义,这一篇我们将会看CoreCLR中对new的定义和处理 new对于.Net程序员们来说同样是耳熟能详的关键词,我们每天都会用到new,然而new究竟 ...
随机推荐
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”
在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...
- 通过ProGet搭建一个内部的Nuget服务器
.NET Core项目完全使用Nuget 管理组件之间的依赖关系,Nuget已经成为.NET 生态系统中不可或缺的一个组件,从项目角度,将项目中各种组件的引用统统交给NuGet,添加组件/删除组件/以 ...
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...
- MySQL中interactive_timeout和wait_timeout的区别
在用mysql客户端对数据库进行操作时,打开终端窗口,如果一段时间没有操作,再次操作时,常常会报如下错误: ERROR (HY000): Lost connection to MySQL server ...
- [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)
前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...
- beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- Atitit 解决Unhandled event loop exception错误的办法
Atitit 解决Unhandled event loop exception错误的办法 查看workspace/.metadata/.log org.eclipse.swt.SWTError: No ...
- Atitit 软件工程概览attilax总结
Atitit 软件工程概览attilax总结 1.1. .2 软件工程的发展 进一步地,结合人类发展史和计算机世界演化史来考察软件工程的发展史. 表2 软件工程过程模型 表2将软件工程的主要过程模型做 ...