oop模型
Klass模型
oop模型是java对象在JVM中的表现形式
比如什么String对象丫,char对象丫,类对象丫在底层都会生成oop对象
Klass模式是java类在JVM中的表现形式
就是java类被类加载器加载后生成的一些对象,比如方法区的InstanceKlass,堆区的InstanceMrroiKlass
对象内存模型
这是内存对象结构图,但实际上好像还有其他的。
- mark word占8字节
- 类型指针在不开启指针压缩情况下,占8字节,开启后占4字节
- 如果有数组,占4字节,没有0
- 实例数据就是java基本类型占用字节数
- 对其填充是指8字节对齐,不够8或者8的整倍数,往后补0
-
为什么要对其填充?
- 因为这样子就可以进行指针压缩,也是为了更好的写代码和规范,因为8字节和8字节倍数转为2进制,后面都是三个零,存储到时候可以直接省略掉,而使用的时候又加上
在不开启指针压缩的情况下,查看数组对象,会进行两次填充。
我没有开启指针压缩,结果是40,而讲道理应该是8+8+4+43+32
而实际上它在对象头那就又填充了一次,就变成了:8+8+4+4+43+4=40
指针压缩
指针压缩实现原理?
指针压缩实现就依赖于8字节对齐,存储的时候删除后三位
开启指针压缩的情况下,一个oop表示的最大对空间是多少
我们知道开启指针压缩的情况下,类型指针占4字节,也就是32位,上一小节说到JVM储存时会抹掉后面的3位,也就是可以保存32 + 3 = 35位,最大内存空间也就是2的35次方,32G
oop(对象指针)如何扩容
如果我们让它16字节对齐,那么我们就可以去掉后面4位,那么就可以表示2^32+4的最大空间了
为什么没有16字节对齐
因为16字节对齐会得不偿失,反而很多地方在对齐的时候会浪费太多内存