00:00
好,同学们,我们继续,那接下来我们来剩下最后一个问题。忽略压缩指针的影响。来,前面也给大家说过,这个结果呈现八加四。12 12和16是两个不同的数字,必然有蹊跷。OK,好了,那么同学们,接下来我们呢,就来说一下压缩指针相关的说明命令,也即到底这个压缩指针。开启与否,对于我们有一个对象,还是不是16字节这个定论会不会有影响和波动。来同学们,下面。我们这么干,先说理论,再说实操。Java-XX冒号加就是代表开启,打印出command line flex,那么这个是什么意思呢?就是说你Java虚拟机启动的时候,你给我把你启动人家配置好的。
01:04
全部参数给我打印出来,这个东西就相当于说你在Java虚拟启动的时候,你开启了哪些参数。用了哪些说明,全部尾巴给我打印出来,OK,那么这个时候我们呢,来看一眼,那么这个命令啊,在Java虚拟机里面我们也讲过,意思是说白了,比如说有时候你呢,不是一个普通的运行,或者就说你在运行过程当中所开启的一些参数,有哪一些,挨个挨个给我罗列好。那么来,同学们。我们这儿就一跑,我们它这儿会告诉你,我本次加尔逊机运行,那么我初始化的堆内存,最大的堆内存。等等等等,这些是什么,然后大家请看。加号使用了compressed,这什么意思啊,压缩的意思意思就是使用了压缩了class points压缩过类型指针,所以说在前面。
02:00
它这儿被压缩了,因为它为了更小的内存占用,做更多的事儿,螺丝壳里做道场,那么这个时候说明什么?人家本身就很。牛逼,而且还给你更小的节约了内存空间,哎,它默认我们可以看得出它开启了这个压缩,所以说在那是四字节,明白,好,你们来吧。我们这个一压缩了以后,我们这儿的结果就会有,这上面是。两个四对象头,前两个就是MARK8个字节,由于你压缩了以后,等后面的class point就是多少四个字节,那么所以说三四就是多少12,那么不够八的倍数倍。加大,然后你看下一个对象的对齐,怕精度丢失的话,给你补了四位,所以说多少16个字节明白,这个就是我们的默认出厂配置好,那么下面。
03:04
我们这儿呢,可以给大家呢,说一下这个,写一下这个结论吧,啊干脆。呃,第一种啊。来默认配置啊,那么也就是什么启动了压缩。请看好,就是这个加号啊,这个加号代表的是开启。那么启动了。压缩指针,这个代表开启,那么此时它呢,就是多少12。加四,这个四就是对齐填充。OK,那么最后多少,那么就是。一个对象16自己弟兄们。没有任何问题吧。好,接下来证明,首先。我们呢,直接使用这么一个参数来吧。
04:00
回到我们的终端,我们呢?跑一下同学们请看是不是也是带有着带着我们的什么初始化对内存,呃,最大的对内存意思就是说这个就是一用这个命令,就是你本次Java虚拟机启动到底带着哪些参数给我全部打出来,那么这儿初始和最大的对内存大小是否开启了压缩指针,然后呢,比如说我们默认使用的是什么?呃,并行的GC垃圾回收器等等等等,好机压号这个是不是就叫开启啊,这一波没问题吧,好了,那接下来只要你一开启用了这个以后,我们来用个最简单的啊,我们把这个呢。给他。暂时住掉。我们就看我们的object,我们object里面就是一个对象,没有什么实例填充的数据,我们这个时候大家看一下一跑。哦,抱歉,我们前面的那个参数还没取掉啊,那么来我们先把这个干掉。
05:00
好,我们再来运行一下,那这个时候是不是和我们的笔记一样,那么来。总共是多少?16个一个对象16字节,那么就是12加四,这个四是有这句话的,是对齐填充补出来的,好,那么下面同学们可以看得出啊,假如说啊,我们的它customer,这是我们自己的,那么现在我把它注掉,我把customer。给大家呢,打开object是出产的,是我们自己造的,那么来。按照默认,大家请看一眼多少是不是也是和我们的我一样,现在肚子里面是空空如也,所以说没有实力数据只有一个对象头,那么大家请看12加46字己O了吧,应该很清楚了。那么接下来。上述表示开启了这个已节约空间,那么假如不压缩呢,我们呢,第二种情况,手动关闭压缩,再看看加号是开启,那么减号呢就是关闭,OK,我们把类型指针呢给它关了,那么同学们,蝼蚁。
06:11
当然啊,实际工作中你不用去改,我们这儿只是给大家就当是介绍一种课外知识,明白了吧?那么来,同学们请看,这是减掉就是。关闭压缩,那么敞开用敞开使用,OK,那么现在我们呢,先跑一下。这个时候同学们看一下效果。什么情况,同学们是不是这个四啊,就没有在那个什么路子,什么丢兔,由于什么的精度丢失的话呢,给你对象补齐,所以说直接就干到多少16字节。OK,所以说呢,我们这就可以得到如果是什么。手动配置啊,那么这个上面是这个是启动对吧,我们这个是减号,那么就是关闭了压缩指针,OK,那么相当于说这个参数它的。
07:05
使用就是减号,那么来同学们怎么着,直接是不是八个字节的,也就是我们这儿一直强调的mark word占八个字节,类型指针占八个字节,一共多少16个字节,那么在这我们就可以看得出。直接就是什么16字节,我们也懒得去写这个了,也就是他没有什么对齐填充了,相当于直接就是八加八,OK,那么八加上八等于16字节,那么也就是什么一个对象16字节,那么从这我们可以获得,不管你是否开启压缩指针,默认一个只有一个对象头的话,就是16个字节,完全符合我们这所定义和规定的内容。OK,好,那么同学们这个,那么请大家呢,都会明白,那么大家请看。在这块是不是直接我取掉以后object,也就是我们的什么16个字节,OK好,那么在这块呢,我们呢,给大家的介绍算是暂告一段落,也给大家说清楚了,那么来最后那么换成其他对象,我们这也就不演示了啊哦,那么大家请看我们这前面也说过,你看不are int double来吧,和刚才一样啊,那么前四个12,那么来吧,我们用默认的。
08:25
压缩一下,四位是硬套,八位是double,一位是布尔,全部是25不够,那么补个七有这句话就说明什么。开启了压缩性能更好一些,你不要去调它啊,它用用性能更好,我们这儿只是为了教学,给大家做一下演示啊,那么25加七三十二个字节永远是八字节的整数倍,那么对象头。实例数据对齐填充,三位一体,给他完完整整的说明了Java对象内存布局和对象头内部的原理和代码的说明,那么为我们下一章做好铺垫,好第11章就给大家介绍到这儿,感谢各位同学的聆听,谢谢。
我来说两句