指针压缩

java基础

Posted by TBKK on August 19, 2020

什么事指针压缩

在32位机器上,一个指正的长度是32位,就是4个字节,突然有一天,机器都变成了64位了,指针长度都变成8字节了,凭白无故多了一倍,特别不爽,于是就有了指针压缩。

为什么到32G指针压缩就失效了

大家都知道,32位机器最大支持内存是不到4G,因为32位指针的范围是2^32,也就是4G,只有到了64位机器才能支持到2^64位地址。那java是怎么把这个4G,一下子扩展到支持32G的呢。

Java对象在内存里的样子

指针指向的是对象。那么java对象是什么样子的。 image 最后一部分有个东西叫补齐,所以,所有的Java对象都是8字节对齐的,这意味着,0x00004,这个地址不可能是一个对象的开始。 指针只要记录开始地址就行了,因为是8字节补齐,所以最大可以支持到4G*8 = 32的大小。

对象里有个东西叫ClassPointer,这个就是需要压缩的那个指针。不压缩就是8字节,压缩了就是4字节。

哪些东西可以压缩,哪些不会压缩

函数运行时相关的不能压缩,

  • 参数
  • 局部变量,
  • 返回值,
  • NULL,
  • 指向永久代Class的指针

下列的会被压缩

  • 对象的全局静态变量(类属性)
  • 对象头信息
  • 对象的引用类型
  • 对象数组类型