JVM学习之指针压缩

oop模型

在这里插入图片描述

Klass模型

在这里插入图片描述
oop模型是java对象在JVM中的表现形式

比如什么String对象丫,char对象丫,类对象丫在底层都会生成oop对象

Klass模式是java类在JVM中的表现形式

就是java类被类加载器加载后生成的一些对象,比如方法区的InstanceKlass,堆区的InstanceMrroiKlass

对象内存模型

这是内存对象结构图,但实际上好像还有其他的。
在这里插入图片描述

  1. mark word占8字节
  2. 类型指针在不开启指针压缩情况下,占8字节,开启后占4字节
  3. 如果有数组,占4字节,没有0
  4. 实例数据就是java基本类型占用字节数
  5. 对其填充是指8字节对齐,不够8或者8的整倍数,往后补0
为什么要对其填充?
因为这样子就可以进行指针压缩,也是为了更好的写代码和规范,因为8字节和8字节倍数转为2进制,后面都是三个零,存储到时候可以直接省略掉,而使用的时候又加上

在不开启指针压缩的情况下,查看数组对象,会进行两次填充。

在这里插入图片描述

我没有开启指针压缩,结果是40,而讲道理应该是8+8+4+43+32
而实际上它在对象头那就又填充了一次,就变成了:8+8+4+4+4
3+4=40
在这里插入图片描述

指针压缩

指针压缩实现原理?

指针压缩实现就依赖于8字节对齐,存储的时候删除后三位

开启指针压缩的情况下,一个oop表示的最大对空间是多少

我们知道开启指针压缩的情况下,类型指针占4字节,也就是32位,上一小节说到JVM储存时会抹掉后面的3位,也就是可以保存32 + 3 = 35位,最大内存空间也就是2的35次方,32G

oop(对象指针)如何扩容

如果我们让它16字节对齐,那么我们就可以去掉后面4位,那么就可以表示2^32+4的最大空间了

为什么没有16字节对齐

因为16字节对齐会得不偿失,反而很多地方在对齐的时候会浪费太多内存

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值