C#C# CLR via 对象内存中堆的蕴藏【类型对象指针、同步块索引】

目前在看书,看到了目的在内存中的存储方式。

C#,讲到了对象存储在内存堆中,分配的上空除了品种对象的积极分子所需的内存量,还有额外的成员(类型对象指针、 同步块索引 ),看到这多少个自家就有点不懂了,不亮堂类型对象指针是什么,指向的怎么?

从网上找也未尝找到,最终往下看,书中多少描述。说下自家的理解:

项目对象指针:指向类型对象存储的地址,假使有一个连串Person,它在堆中有一块区域存储它其中的字段和成员以及五个附加成员(类型对象指针、 同步块索引 ),类型对象的品类对象指针指向的是System.Type的地方。

因为Person类型在内存中相对于System.Type也是当做一个目的存在的,System.Type类型也是一个品类对象,它的档次对象指针指向自身;

实例化一个Person对象,Person p = new
Person(); p对象在内存堆中也分配一块区域存储它其中的字段和成员以及六个附加成员(类型对象指针、 同步块索引 ),p的花色对象指针指向Person类型在堆中的地址。

 

同步块索引:先说一下一头块,.NET团队在计划主旨框架时充足考虑了线程同步的题目,其结果就是.NET为每一个堆内对象都提供了支撑线程同步的效果,这就是联合机制的雏形【参考:http://genwoxuedotnet.blog.51cto.com/1852748/504107

而是对每个堆内对象都分配同步块有一个较大的坏处,就是这般增大了内存的耗费。在相似的系统中,需要共同机制协助的目标可能只占少数,这样对于大部分对象的话,一个协同块的内存消耗就全盘被荒废了。鉴于那或多或少,.NET框架选拔了一种折中的办法,就是实在只为每个堆内对象分配一个一头索引,该索引中只保留一个标明数组内索引的平头。.NET在加载时会新建一个合伙块数组,当某个对象急需被同步时,.NET会为其分配一个齐声块,并且把该联合块在联名块数组中的索引参预该对象的一路块索引中。

同步块机制包含如下的几点:
·
在.NET被加载时开始化同步块数组。
·
每一个被分配在堆上的对象都会含有五个附加的字段,其中一个囤积类型指针,而此外一个就是一起块索引,起头时被赋值为-1。
·
当一个线程试图利用该目标进入同步时,会检查该目的的联手索引。如若索引为负数,则会在联名块数组中检索抑或新建一个联袂块,并且把共同块的索引值写入该目的的同步索引中。如若该目的的同步索引不为负值,则找到该对象的协同块并且检查是否有任何线程在采取该联合块,如若有则进入等待情状,倘若没有则声明使用该同步块。

同步块是指.NET维护的联合块数组中的某个元素

 

相关文章