什么事指针压缩
在32位机器上,一个指正的长度是32位,就是4个字节,突然有一天,机器都变成了64位了,指针长度都变成8字节了,凭白无故多了一倍,特别不爽,于是就有了指针压缩。
为什么到32G指针压缩就失效了
大家都知道,32位机器最大支持内存是不到4G,因为32位指针的范围是2^32,也就是4G,只有到了64位机器才能支持到2^64位地址。那java是怎么把这个4G,一下子扩展到支持32G的呢。
Java对象在内存里的样子
指针指向的是对象。那么java对象是什么样子的。
最后一部分有个东西叫补齐,所以,所有的Java对象都是8字节对齐的,这意味着,0x00004,这个地址不可能是一个对象的开始。
指针只要记录开始地址就行了,因为是8字节补齐,所以最大可以支持到4G*8 = 32的大小。
对象里有个东西叫ClassPointer,这个就是需要压缩的那个指针。不压缩就是8字节,压缩了就是4字节。
哪些东西可以压缩,哪些不会压缩
函数运行时相关的不能压缩,
- 参数
- 局部变量,
- 返回值,
- NULL,
- 指向永久代Class的指针
下列的会被压缩
- 对象的全局静态变量(类属性)
- 对象头信息
- 对象的引用类型
- 对象数组类型