【随笔】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 ...
随机推荐
- C++继承产生的问题
今天写代码,用到了继承,忘了将父类中的私有成员改为protected,结果一调用父类地函数后,子类中的root指针直接变为了父类中的空的root.私有成员在继承后依然会保留,占一定的内存空间,但却没有 ...
- SpringCloud微服务(05):Zuul组件,实现路由网关控制
本文源码:GitHub·点这里 || GitEE·点这里 一.Zuul组件简介 1.基础概念 Zuul 网关主要提供动态路由,监控,弹性,安全管控等功能.在分布式的微服务系统中,系统被拆为了多个微服务 ...
- 我为什么建议前端将Python 作为第二语言?
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 前端劝退师 PS:如有需要Python学习资料的小伙伴可以加点击下 ...
- js 报错 Uncaught TypeError: Cannot read property 'trim' of undefined
jquery Uncaught TypeError: Cannot read property 'trim' of undefined 报错原因及解决方案 $.trim() 函数用于去除字符串两端的空 ...
- 在vue项目中的js文件里使用vue实例
参考的网址:https://blog.csdn.net/weixin_34353714/article/details/86958742 不为其他,就为了记录一下,方便以后查看: 第一种方法: 1.首 ...
- Tensorflow创建会话,启动会话
import tensorflow as tf #定义一个常量 m1=tf.constant([[,]])#这是一个一行两列的数据 print(m1) m2=tf.constant([[],[]]) ...
- Thymeleaf对象的使用:基本对象
Thymeleaf中有许多内置对象,可以在模板中实现各种功能.下面有几个基本对象.Web对象常用有:request.session.servletContext.Thymeleaf提供了几个内置变量p ...
- 微信小程序出现 text 设置行高 line-height 无效的问题
前言: 我在写程序过程中遇到过给text加line-height不生效的问题,但是也有生效的情况,如果不生效了就按下面的解决方法处理吧. 解决办法: 在text的外层嵌套一层view,然后给view设 ...
- ORM优化查询、choices参数
目录 ORM查询优化 only与defer select_related和prefetch_related MTV与MVC模型 choices参数 ORM查询优化 only与defer res = m ...
- Codeforces Round #588 (Div. 2)
传送门 A. Dawid and Bags of Candies 乱搞. Code #include <bits/stdc++.h> #define MP make_pair #defin ...