Jvm|为什么压缩指针还需要 解压缩指针 左移 3 位?

压缩指针需要通过左移 3 位(等同于乘以 8)来解压缩,是因为压缩指针的设计利用了 Java 对象在内存中的 8 字节对齐 特性。下面是详细的原因:

1. 内存对齐特性

在 64 位系统中,Java 对象的内存地址通常是 8 字节对齐 的。这意味着对象的内存地址总是 8 的倍数,换句话说,对象地址的最后 3 位二进制数总是 000。例如,一个对象可能位于内存地址 0x000000080x000000100x00000018,等等。

2. 压缩指针的设计

为了节省内存,Java 虚拟机将 64 位的对象地址压缩为 32 位的压缩指针。具体做法是将原始 64 位地址除以 8(右移 3 位),因为内存地址是 8 字节对齐的,这样不会丢失信息。例如,地址 0x00000008 在压缩后变成 0x00000001,而 0x00000010 压缩后变成 0x00000002

3. 解压缩指针(恢复原始地址)

当需要使用这个压缩指针来访问对象时,必须将它转换回原始的 64 位地址。具体操作是将压缩后的 32 位值左移 3 位(乘以 8),这样就恢复了原始的 64 位地址。例如:

  • 压缩指针 0x00000001 在解压缩时被左移 3 位,恢复成 0x00000008,这是原始的内存地址。
  • 压缩指针 0x00000002 在解压缩时被左移 3 位,恢复成 0x00000010

4. 节省内存与高效访问的平衡

通过这种方式,Java 可以使用 32 位的指针来表示比 32 位系统更多的内存地址(最大 32 GB)。虽然在访问对象时需要进行一次简单的左移操作,但这几乎没有性能开销,而且带来了显著的内存节省。内存对齐使得压缩和解压缩过程都非常自然且高效。

总结

压缩指针左移 3 位(乘以 8)是为了恢复原始的内存地址,这是基于 Java 对象的 8 字节内存对齐特性,确保在节省内存的同时依然能够高效地访问对象。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值