00:00
接下来给大家介绍一下实例数据和对齐填充,打开我们架构图,上面我们花费了大量的时间给大家详细证明,并说明了马二的对象标记和类型指针。一句话,蛇无头不行,任何一个对象出来,100%会有对象头,对吧?你可以把它理解为对象头就是一个火车头。一个火车头没有车厢,是可以独立运行,可以开动的,那么后面的实力数据和对齐填充可以近似的理解为是两节车厢。OK,有火车头带着两节车厢,那现在我们来看何为实例数据,为什么要有对齐填充?先看实例数据。存放类的属性field的数据信息,包括附类,也就它继承的哪些,第三个叫对齐填充。虚拟机要求对象的起始地址必须是八字节的什么整数倍填充数据不是必须存在的,仅仅是为了字节对齐,这部分内存按八字节补充对齐。
01:08
我相信听完这个理论或多或少有点懵逼,下面一句话给你讲清楚,同学们。如果我现在就定义了一个class,它里面什么都没有,空空如也,那么这个时候就是我们刚才所说的只有一个对象头的。实例对象,那相当于说按照我们前面所说。在64位系统当中,任何一个对象你定义出来了百分之百六出来的时候,它一定要有对象逃,只要有对象逃,那么这个对象一定有对象标记,马尔的八字节类型指针八字节一共16个字节,这是躲不掉的,相当于这个时候就是孤零零的只有什么一个火车头,那接下来特ID。或者说我们这儿Y型。Flag。
02:01
假设等于false。OK,那各位同学就看清楚了,此时对象头任何一个对象都天生自带这个,没什么好说的啊,有这个就代表什么存放类的属性field的信息,俗称实例数据明白,也即现在的话呢,我们是不但有一个火车头,还有了一节车厢。那么现在由这个头带着这个车厢,那么当然这个里面还可以有很多啊,那假设那么customer。那幕,哎,等于,等于多少或者都可以,那么来我们这儿就会明白了,中间这些定义的field就叫实例数据,那对其填充又是什么意思呢?前面强调过。如果孤零零的一个对象默认起步价,那么就是16字节。这儿请大家。忽略压缩指针的影响,哎,也就这个东西是什么,你先不要管,现在就请大家非常简单的就这么认为。
03:05
任何一个对象肯定要有一个对象头,类似于我们的火车头,那么现在假设这个里面没有实例数据的话,现在我们一个64位系统当中,对象头是由这个和这个构成,就是16字节,OK,后面我们会再说压缩指针的事儿,你现在就先暂时啊,粗略的先理解为一个对象头就是16字节O吧。好,那么接下来我们刚刚所说过了int类型。占几个字节?32位,那么就是四字节,OK,再加上布尔奇占多少个字节?八位一个字节,那么这个时候同学们。大家都清楚啊,我们加起来的话,那是不是就是21字节OK吧,那么现在我们就来过到这了。第一个火车头有铁经有一个,那么就是我们的对象头,那么请不考虑压缩指针的影响,就认为是16字节,那现在来了一节车厢,叫实例数据,这个实例数据这个车厢里面现在有两个乘客,两个乘客一个是in特,一个是不管共计多少个字节,五个那么16。
04:17
加上四加上一二十一字节,OK,那么下面有了火车头第一个车厢实力数据,这个车厢两个费的两个乘客,那么接下来就是对齐填充,因为Java虚拟机规定对象的起始地址必须是八字节的整数倍,那么下面就来了第二个车厢来给它填充对齐,那么大家请看,目前按照我们忽略压缩指针的影响的话,就是21字节,那么三八二十四这个时候他会干一个什么对齐填充?OK,那么直接干嘛,再给你补到24字节。形成八的整数倍,OK,所以说这个就是我们。
05:05
六了一个对象以后,对象头实例数据,对齐填充三者共同作用,才能够有一个完整的对象,哎,所以说一定要注意对齐填充不足的部分,一定要把它搞得字节对齐,按照八字节的整数倍来进行补充好,那么这个就是我们的对象头、实例、数据和对齐填充三部分的组合以及相关的使用。当然。后面。我们再给大家更进一步深度的讲解啊,会给大家说一下内存指那个压缩指针这个事儿,好,那么接下来回过来。按照我目前我们所说的这个来看看官网,首先hotport这个术语,这个官网啊,由于这个官网它是国外的,打开贼慢,我们这儿为了不耽误时间,那么我呢,直接已经将它最重要的内容给抓下来,首先大家请看。
06:00
对象头,一个结构开始,任何一个可以GC管理到的在堆空间的一个对象啊,这是一个通用的结构,都要有一个对象头,那么每一个o op指针就会指向一个对象头,好那么它包括了一些基础的信息,关于在堆里面的这个对象的布局,对象类型,GC垃圾回收的这些状态,对吧,比如说次数啊或者等等,然后呢,所的标识以及标识它的这个什么哈西扣好它呢有两个构成。OK two words,那么说白了,对象头是由两部分构成的,那么当然如果说在数组的话呢?它呢,最主要呢,还是再加一个什么长度的这么一个lengths field的这么一个表达,前面我们都说过,你们注意所有的Java对象和Java虚拟机内部的对象都有一个通用的对象头的这么一个结构,所以说就像我们刚刚说,刚刚所说的,就像一个人一样,任何一个人生出来出娘胎,你应该带着个头吧,OK,好,请看有两部分构成哪两部分。
07:04
来,The first word of every object hand,那么第一个就叫markwa,就是我们所说的对象标识,它用了一系列的包含这些什么锁状态,这个哈希编码等等,那么提供这个类型指针,OK,后面我们会说好,这是第一个,第二个你看the sc word就是第每一个对象头的第二部分叫k point,就是我们的那个马甲,那套模板,类型指针指向了另外一个对象,对吧?OK,那么它呢,描述了这个布局和行为,和任何一个通用的对象,比如说一个Java对象,这个K包含了一个C加类型的一个V这么一个内容,好,那么这个呢,就说明什么,在官网上明确可以知道任何一个对象都要有个对象头,对象头有这个和这个。OK,两部分组成。那么接下来。底层源码我们来看一下,来这块呢,我也给大家抓好图了,那么o op就是对象的一个定义,来同学们请看啊,有这个定义以后,你看我们这叫mark op,那么对象标识,那么大家请看啊,Mark op op,那么V下划线是个。
08:16
Mark,然后这个里面请看有个kla类型指针,那么就是指向这个对象所构成的这个模板,那么好大家请看啊,这个C呢是一类似一个结构体啊,你大致了解就行了,不用大家搞懂这个C加加的代码,那么我们这定义了mark op,那么这是产量return_mark,那么它联合的,那么就是会带着给你一个这个mark就是我们的对象标记,而这个Meta data,那么它的这个里面就会带着我们的k point类型指针,好,那么大家请看。下划线这个mark字段,OK,就是我们的mark word对象标记,下划线me date就是类型支称,来下划线UN点联合吧,下划线me date就是我们的K类型指针。所以说从官网的理论到底层C加加的源码都可以看得出对象标记类型指针人家可是带着的,所以说这个对象头好,这么一个对象的定义,Op嘛,面向对象嘛,这么一个定义人家告诉你了,那么就要带着一个对象标记和类型指针。好,那么下面可以看得出这个这段的跟前面所看到的呃,英文官网差不多,主要就这句话,每个对象都有这个k point和。
09:33
头的这个word mark word所构成,OK,好,那么同学们,搁到这,我们彻彻底底给它完成了。一个对象由对象头、实例、数据和对齐填充三分构成。对象头里面有含对象标记和类型指针,那么对象标记代表着那些哈希马。所的状态GC的信息,记着有个小本本对吧?什么类型指针要告诉大家,我这个对象实列六出来,这个对象实列在对里面的,这个对象实列来自于哪一个模板,那么实例数据我们都清楚啊,这个对象里面它所定义的field的,OK,那每个field也是占一定字节的,那么结合对象头它有多大,那么这个就是初步大小,到最后要按照八的字节整数倍来进行对齐填充好。那么同学们对象在对内存当中的组成和布局就给大家介绍到这儿。
我来说两句