1.对象在内存中的存储布局是什么样的?
如 : Objecg o = new Object();
一个普通的对象分为四个部分:
1.1markword : 占用8个字节 ; 包含的信息:锁信息(上锁实际上就是修改了markword),hashcode,GC
1.2类型指针: 占用四个字节 ; 指向o 1.3实例数据:用来表示Object内部的成员变量,例如如果有int m;则占有4个字节 1.4对齐: 最后加到一起不能被8整除的时候,用来补全。
其中markword 和 类型指针 组成对象头 jvm对象头信息是与对象自身定义的数据无关的额外存储的信息,由于它存在于对象中,jvm规范中安装对象类型,分两种类型:
- 普通对象包含:Mark Word、元数据指针(Klass Pointer)
- 数组对象包含:Mark Word、元数据指针(Klass Pointer)、Array Length
## 不同类型JVM下,对象头每一部分占用内存大小(单位:bit):
数据类型 32位jmv 64位jvm 开启指针压缩的64位JVM
Mark Word 32 64 64
Klass Pointer 32 64 32
Array Length 32 32 32
可见,在64位的JVM中,开启指针压缩(-XX:UseCompressedOops)只会影响到Klass Pointer。而数组长度不管在什么类型的JVM里都是32bit。