【随笔】CLR:向头对象(Object Header)迈进一大步!!!
前言
在我之前一篇随笔里(戳我),我们知道,一个引用类型的对象,包含了2个额外的开销,一个是头对象(object header),一个是MT。我们接下来看看头对象到底有多神秘。。。
Object Header中的布局
头对象共32位,每一位都有不同的用途

- 当27位为1时:则0~26位存储的都是和thin lock相关的信息,其中还细分了3个范围用来存放不同的信息
- 当27位为1时&26位为1时:则0~25位存储的都是对象的hash值
- 当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)迈进一大步!!!的更多相关文章
- CLR和.Net对象生存周期
标签:GC .Net C# CLR 前言 1. 基础概念明晰 * 1.1 公告语言运行时 * 1.2 托管模块 * 1.3 对象和类型 * 1.4 垃圾回收器 2. 垃圾回收模型 * 2.1 为什么需 ...
- CLR和.Net对象
CLR和.Net对象生存周期 前言 1. 基础概念明晰* 1.1 公告语言运行时* 1.2 托管模块* 1.3 对象和类型* 1.4 垃圾回收器 2. 垃圾回收模型* 2.1 为什么需要垃圾回收* 2 ...
- Java 调用Web service 加入认证头(soapenv:Header)
前言 有时候调用web service 会出现 Message does not conform to configured policy [ AuthenticationTokenPolicy(S) ...
- 一个简单的游戏开发框架(五.对象Object)
前面提到我们把行为Action从对象Object中分离了出来,用各种不同的行为组合出对象的功能.大家都知道,面向对象的一个类,就是数据和操作的集合.操作(行为)被分离出来了,数据怎么办呢?操作依赖的数 ...
- Java中的对象Object方法之---wait()和notifiy()
这一篇咋们继续,接着来介绍wait()和notify()方法,我们都知道这两个方法和之前介绍的方法不太一样,那就是这两个方法是对象Object上的,不属于Thread类上的.我们也知道这两个方法是实现 ...
- js内置对象-Object
1)Object构造函数的方法 返回指定对象的原型对象 Object.getPrototypeOf(mymap); /*{featureStyle: {…}, selfLayersCount: nul ...
- 对象Object
功能分类 1. 创建对象 把各对数自身拥有的可枚举属性复制到第一个对象并返回:obj = Object.assign(o1, o2, o3),o1=obj ...
- java的类class 和对象object
java 语言的源代码是以类为单位存放在文件中,已public修饰的类名须和存放这个类的源文件名一样.而 一个源文件中只能有一个public的类,类名的首字母通常为大写. 使用public修饰的类可以 ...
- 1月5日 对象Object, 含过去看的英文档的总结链接
Object 也是一种数据类型,可以有属性,有method. 反之,在Ruby中,每一种数据类型都是Object.如String,Integer,Float,Array,Hash. IN Ruby e ...
随机推荐
- Ubuntu18.04 下最好用的gif录制工具peek
最近在写代码,需要找一个ubuntu下的录制屏幕工具,尝试了几个,发现peek是最好用的.这里就给大家推荐一下. 一 安装: 该软件是一个在gihtub上的开源软件,源码路径: https://git ...
- 某小公司RESTful、共用接口、前后端分离、接口约定的实践
作者:邵磊 juejin.im/post/59eafab36fb9a045076eccc3 前言 随着互联网高速发展,公司对项目开发周期不断缩短,我们面对各种需求,使用原有对接方式,各端已经很难快速应 ...
- jvm虚拟机笔记<一> 内存区域
运行时数据区域: 程序计数器:字节码的行号指示器. 虚拟机栈:为每个方法创建一个栈帧(存放方法中的局部变量,变量引用等). 本地方法栈:存放本地方法. ------------------------ ...
- 项目中使用http referer,为了盗取图片资源
项目背景:因为图片的数据是爬取的别人的图片,而且保存的数据仅仅是图片地址链接,为了减少数据存储和服务器压力,但是这就引发一个问题,有的图片地址没有做防盗处理,可以随意的下载使用:但有些图片的服务器做了 ...
- leaflet 结合 d3.js 实现 geojson 数据地形剖面分析(附源码下载)
前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...
- 18-搭建本地 Registry
Docker Hub 虽然非常方便,但还是有些限制,比如: 需要 internet 连接,而且下载和上传速度慢. 上传到 Docker Hub 的镜像任何人都能够访问,虽然可以用私有 reposito ...
- 你以为的Jquery选择器是什么样子的?
$("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("d ...
- TSPITR fails With RMAN-06553 (Doc ID 2078790.1)
TSPITR fails With RMAN-06553 (Doc ID 2078790.1) APPLIES TO: Oracle Database - Enterprise Edition - V ...
- docker上启动nginx,并配置修改nginx的配置文件
1.使用docker 下载nginx 镜像 docker pull nginx 2.启动nginx docker run --name nginx -p 80:80 -d nginx 这样就简单的把 ...
- Docker组成三要素
目录 镜像 容器 仓库 总结 Docker的基本组成三要素 镜像 容器 仓库 镜像 Docker 镜像(Image)就是一个只读的模板.镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器. ...