3妹:“去吗 去啊 以最卑微的梦,战吗 战啊 以最孤高的梦, 致那黑夜中的呜咽与怒吼, 谁说站在光里的才算英雄”
2哥:没想到3妹不仅是王心凌女孩,还是孤勇者女孩啊,厉害的👍。
3妹:那是,我很有音乐天赋的,小时候还获得过我们村少儿歌唱大赛一等奖呢,哈哈哈哈~
2哥:别说,还真是挺好听的。
3妹:以后要是失业了,说不定我就转行当歌手了呢。
2哥:呦,还骄傲上了,你离歌手还是差远了呀。咱们还是先把技术学好,失业的可能性就相对比较小了嘛。
2哥:今天我们接着来学习JVM的知识。 讲课
对象在内存中分三部分存储
对象在内存中存储布局主要分为对象头,实例数据和对齐填充三部分。
这是网上看到的一张图:
对象头
对象头主要包含对象自身的运行时数据(也就是图中Mark Word),类型指针(图中的Class Pointer,指向对象所属的类)。如果对象是数组,还需要包含数组长度(否则无法确定数组对象的大小)。
Mark Word:存储对象自身的运行时数据,例如hashCode,GC分代年龄,锁状态标志,线程持有的锁等等。在32位系统占4字节,在64位系统中占8字节。
Mark WordClass Pointer:用来指向对象对应的Class对象(其对应的元数据对象)的内存地址。在开启了指针压缩时,占4字节。(默认是开启的)
Length:如果是数组对象,还有一个保存数组长度的空间,占4个字节。
实例数据
保存对象的非静态成员变量数据。实例数据存储的是真正的有效数据,即各个字段的值。无论是子类中定义的,还是从父类继承下来的都需要记录。这部分数据的存储顺序受到虚拟机的分配策略以及字段在类中的定义顺序的影响。
对齐填充
因为HotSpot虚拟机的自动内存管理系统要求对象起始地址是8字节的整数倍,所以任何对象的大小必须是8字节的整数倍,而对象头部分一般是8字节的倍数,如果实力数据部分不是8字节的整数倍,需要对齐填充来补全。
如何计算一个对象在内存中占多少个字节?
由于默认是开启了指针压缩的,现在普遍的机器位数都是64位,如果对象是普通对象,非数组类型,那么就是对象头部分就是12字节(类型指针4字节,Mark Word 8字节),假设这个对象只有一个Integer变量,那么在实例数据部分就是一个引用变量的空间4字节,总共是16字节,由于正好是8的倍数,就不需要进行对齐填充了。
网友评论