java指针压缩

什么是 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(指向元空间中的类元信息),另一类是对象的引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值