前言

  在我之前一篇随笔里(戳我),我们知道,一个引用类型的对象,包含了2个额外的开销,一个是头对象(object header),一个是MT。我们接下来看看头对象到底有多神秘。。。

Object Header中的布局

头对象共32位,每一位都有不同的用途

  1. 当27位为1时:则0~26位存储的都是和thin lock相关的信息,其中还细分了3个范围用来存放不同的信息
  2. 当27位为1时&26位为1时:则0~25位存储的都是对象的hash值
  3. 当27位为1时&26位为0时:则0~25位存储的都是sync block index,指向的是sync block table

相关资料可参见:

https://mycodingplace.wordpress.com/2018/01/10/object-header-get-complicated/

https://www.markopapic.com/csharp-under-the-hood-locking/

https://github.com/dotnet/coreclr/blob/master/Documentation/botr/threading.md

Object Header常用的4个用途

1。线程同步

  lock的时候会用到,(戳我),这里不再演示,不过下面我想用lldb来一探究竟。

先来看下我们的代码:

然后我们用lldb, attach进去看看

试了下,这个syncblk命令不可用,我们换一个

发现还真有2处地方,拥有锁,我们通过地址,继续剖析:

图中,第二个锁,就忽略了,应该是console程序用的,和本案例无关,我们只看第一把锁,这已经证明了当前执行线程中的内存中,存在一把锁,而且是thinlock,

被锁的对象,则是Person对象p1。好奇的你应该会问:thinlock又是什么鬼。我找了一些资料

https://devblogs.microsoft.com/premier-developer/managed-object-internals-part-2-object-header-layout-and-the-cost-of-locking/

https://mycodingplace.wordpress.com/2018/01/10/object-header-get-complicated/

2。Hash值存储

上代码

程序跑起来,然后找到person对象:

当我们调用了对象的gethashcode方法之后,clr会把这个对象的hash值,存储在对象头中:

我们把对象头中的前8位拿出来,0x0e97b065,然后转成2进制,得到1110100101111011000001100101,我们逐位代入到表格中:

由表格中可以得出,当前同步信息存储的这个值,符合BIT_SBLK_IS_HASH_OR_SYNCBLKINDEX:1 & BIT_SBLK_IS_HASHCODE:1

表示0~25位之间,存放的是该对象的hash值。我们把值取出来则为10100101111011000001100101,然后转化成10进制则为:43495525

刚好与我们打印出来的内容一致。

所以说,对象的头信息中还有存放Hash值的用途。

3。用于GC回收时的标记阶段

4。用于GC析构阶段

【随笔】CLR:向头对象(Object Header)迈进一大步!!!的更多相关文章

  1. CLR和.Net对象生存周期

    标签:GC .Net C# CLR 前言 1. 基础概念明晰 * 1.1 公告语言运行时 * 1.2 托管模块 * 1.3 对象和类型 * 1.4 垃圾回收器 2. 垃圾回收模型 * 2.1 为什么需 ...

  2. CLR和.Net对象

    CLR和.Net对象生存周期 前言 1. 基础概念明晰* 1.1 公告语言运行时* 1.2 托管模块* 1.3 对象和类型* 1.4 垃圾回收器 2. 垃圾回收模型* 2.1 为什么需要垃圾回收* 2 ...

  3. Java 调用Web service 加入认证头(soapenv:Header)

    前言 有时候调用web service 会出现 Message does not conform to configured policy [ AuthenticationTokenPolicy(S) ...

  4. 一个简单的游戏开发框架(五.对象Object)

    前面提到我们把行为Action从对象Object中分离了出来,用各种不同的行为组合出对象的功能.大家都知道,面向对象的一个类,就是数据和操作的集合.操作(行为)被分离出来了,数据怎么办呢?操作依赖的数 ...

  5. Java中的对象Object方法之---wait()和notifiy()

    这一篇咋们继续,接着来介绍wait()和notify()方法,我们都知道这两个方法和之前介绍的方法不太一样,那就是这两个方法是对象Object上的,不属于Thread类上的.我们也知道这两个方法是实现 ...

  6. js内置对象-Object

    1)Object构造函数的方法 返回指定对象的原型对象 Object.getPrototypeOf(mymap); /*{featureStyle: {…}, selfLayersCount: nul ...

  7. 对象Object

    功能分类                       1. 创建对象 把各对数自身拥有的可枚举属性复制到第一个对象并返回:obj = Object.assign(o1, o2, o3),o1=obj ...

  8. java的类class 和对象object

    java 语言的源代码是以类为单位存放在文件中,已public修饰的类名须和存放这个类的源文件名一样.而 一个源文件中只能有一个public的类,类名的首字母通常为大写. 使用public修饰的类可以 ...

  9. 1月5日 对象Object, 含过去看的英文档的总结链接

    Object 也是一种数据类型,可以有属性,有method. 反之,在Ruby中,每一种数据类型都是Object.如String,Integer,Float,Array,Hash. IN Ruby e ...

随机推荐

  1. 【STM32-V7】STM32H743XIH6开发板,丰富软件资源,强劲硬件配置,大量软件解决方案持续更新中(2019-12-12)

    说明: 争取做更多的实战性应用,分享更多的嵌入式技术,希望能在实际项目中帮到大家. (1)V7将大力加强对初学者的支持力度,已经更新至63章,下载链接,后37章和一批视频教程将加紧制作. (2)事隔五 ...

  2. C sharp #005# 对象与对象变量

    饮水思源:金老师的自学网站 索引 自动装箱 “只读”对象 设定启动窗体 ShowDialog与Show 自动装箱 基本类型的变量值可以自动装箱到一个object对象中, 反过来,object对象也可以 ...

  3. 【数据结构】什么是二叉查找树(BST)

    什么是二叉查找树(BST) 1. 什么是BST 对于二叉树中的每个节点X,它的左子树中所有项的值都小于X中的项,它的右子树中所有项的值大于X中的项.这样的二叉树是二叉查找树. 以上是一颗二叉查找树,其 ...

  4. C# HttpClient设置cookies的两种办法

    前言:最近公司使用HttpClient对象在发送请求,抛弃了之前的HttpWebRequest,使用httpClient有个好处:就是可以只使用一个HttpClient的实例,去完成发送所有的请求数据 ...

  5. 《跟我学shiro》

    张开涛<跟我学shiro>博客系列: Shiro目录 第一章  Shiro简介 第二章  身份验证 第三章  授权 第四章  INI配置 第五章  编码/加密 第六章  Realm及相关对 ...

  6. Thymeleaf对象的使用:字符串对象

    Thymeleaf主要使用 org.thymeleaf.expression.Strings 类处理字符串,在模板中使用 #strings 对象来处理字符串. 开发环境:IntelliJ IDEA 2 ...

  7. linux学习(十)Shell中的控制语句

    目录 1. 条件测试语句 1.1 test语句 1.2[]语句 1.3文件测试 1.4字符串测试 1.5数值测试 1.5逻辑操作符 @(Shell中的控制语句) 1. 条件测试语句 测试语句十Shel ...

  8. subprocess, re模块,logging, 包等使用方法

    subprocess, re模块,logging, 包等使用方法 subprocess ''' subprocess: sub: 子 process: 进程 可以通过python代码给操作系统终端发送 ...

  9. SQL高效运行注意事项(四)

    为了SQLSERVER能高效运行,SQLSERVER的磁盘子系统是一个重要的方面 Avg. Disk Sec/Read 这个计数器是指每秒从磁盘读取数据的平均值 下面的列表显示这个计数器值的范围,并指 ...

  10. Linux开发环境搭建三 使用mount -t cifs 挂载windows共享目录方法与问题解决

    转载链接:https://blog.csdn.net/fuyuande/article/details/82915800 嵌入式开发通常是在linux环境下编译,windows下开发,这就需要在lin ...