什么是
java
对象的
指针压缩
?
1.jdk1.6 update14
开始,在
64bit
操作系统中,
JVM
支持指针压缩
2.jvm
配置参数
:UseCompressedOops
,
compressed
压缩、
oop(ordinary object pointer)
对象指针
3.
启用指针压缩
:XX:+UseCompressedOops(
默认开启
)
,禁止指针压缩
:XX:UseCompressedOops
为什么要进行指针压缩?
1.
在
64
位平台的
HotSpot
中使用
32
位指针,内存使用会多出
1.5
倍左右,使用较大指针在主内存和缓存之间移动数据,
占用较大宽带,同时
GC
也会承受较大压力
2.
为了减少
64
位平台下内存的消耗,启用指针压缩功能
3.
在
jvm
中,
32
位地址最大支持
4G
内存
(2
的
32
次方
)
,可以通过对对象指针的压缩编码、解码方式进行优化,使得
jvm 只用32
位地址就可以支持更大的内存配置
(
小于等于
32G)
4.
堆内存小于
4G
时,不需要启用指针压缩,
jvm
会直接去除高
32
位地址,即使用低虚拟地址空间
5.
堆内存大于
32G
时,压缩指针会失效,会强制使用
64
位
(
即
8
字节
)
来对
java
对象寻址,这就会出现
1
的问题,所以堆内 存不要大于32G
为好。
指针压缩是将35位(2的32次方是4G,2的35次方是32G,所以指针压缩最大只支持32G内存,超过32G就会失效)压缩为32位,而ZGC的寻址是42位起所以ZGC无法使用指针压缩。
PS:ZGC是靠颜色指针来标记对象,jdk11中低42位是对象地址,
低42位指针可以支持4T内存,那么能否通过预约更多位给对象地址来达到支持更大内存的目的呢?答案肯定是
不可以。因为目前主板地址总线最宽只有48bit,4位是颜色位,就只剩44位了,所以受限于目前的硬件,ZGC最大只能
支持16T的内存,JDK13就把最大支持堆内存从4T扩大到了16T。
指针压缩包括两类指针,一类是对象头中的klass(指向元空间中的类元信息),另一类是对象的引用。