欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > JVM 指针压缩

JVM 指针压缩

2024/10/25 9:34:20 来源:https://blog.csdn.net/xuetian0546/article/details/139356148  浏览:    关键词:JVM 指针压缩

运用java内存对齐填充,对java内存进行8字节划分,java对象指针映射到每个划分区域上,使得4个字节(32位)表示2^32个地址,从而使4个字节指针映射32G内存空间。

1.为什么进行指针压缩:

  • jvm从32位变为64位,内存带宽也增加了一倍,原来32位存储一个变量,现在可以使用64位存储,无形中浪费了大量空间。占用较大带宽,同时GC也会承受较大压力。
  • .为了减少64位平台下内存的消耗,启用指针压缩功能
  • 在jvm中,32位地址最大支持4G内存(2的32次方),可以通过对对象指针的压缩编码、解码方式进行优化,使得jvm 只用32位地址就可以支持更大的内存配置(小于等于32G)
  • 堆内存小于4G时,不需要启用指针压缩,jvm会直接去除高32位地址,即使用低虚拟地址空间
  • 堆内存大于32G时,压缩指针会失效,会强制使用64位(即8字节)来对java对象寻址,这就会出现1的问题,所以堆内 存不要大于32G为好

2.开启关闭对象指针压缩

jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩。

  • 启用指针压缩:-XX:+UseCompressedOops(默认开启)
  • 禁止指针压缩:-XX:-UseCompressedOops

对象大小可以用jol-core包查看,引入依赖

implementation group: 'org.openjdk.jol', name: 'jol-core', version: '0.9'

package com;import org.openjdk.jol.info.ClassLayout;public class JOLSample {public static  void  main(String[] args){ClassLayout layout = ClassLayout.parseInstance(new Object());System.out.println(layout.toPrintable());System.out.println();ClassLayout layout1 = ClassLayout.parseInstance(new int[]{});System.out.println(layout1.toPrintable());System.out.println();ClassLayout layout2 = ClassLayout.parseInstance(new A());System.out.println(layout2.toPrintable());}public static class A {int id;String name;byte b;Object o;}
}

配置关闭指针压缩,打印:

# WARNING: Unable to get Instrumentation. Dynamic Attach failed. You may add this JAR as -javaagent manually, or supply -Djdk.attach.allowAttachSelf
java.lang.Object object internals:OFFSET  SIZE   TYPE DESCRIPTION                               VALUE0     4        (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4        (object header)                           50 1f c4 30 (01010000 00011111 11000100 00110000) (818159440)12     4        (object header)                           a0 01 00 00 (10100000 00000001 00000000 00000000) (416)
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total[I object internals:OFFSET  SIZE   TYPE DESCRIPTION                               VALUE0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4        (object header)                           10 0c c4 30 (00010000 00001100 11000100 00110000) (818154512)12     4        (object header)                           a0 01 00 00 (10100000 00000001 00000000 00000000) (416)16     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)20     4        (alignment/padding gap)                  24     0    int [I.<elements>                             N/A
Instance size: 24 bytes
Space losses: 4 bytes internal + 0 bytes external = 4 bytes totalcom.JOLSample$A object internals:OFFSET  SIZE               TYPE DESCRIPTION                               VALUE0     4                    (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4                    (object header)                           08 78 45 32 (00001000 01111000 01000101 00110010) (843413512)12     4                    (object header)                           a0 01 00 00 (10100000 00000001 00000000 00000000) (416)16     4                int A.id                                      020     1               byte A.b                                       021     3                    (alignment/padding gap)                  24     8   java.lang.String A.name                                    null32     8   java.lang.Object A.o                                       null
Instance size: 40 bytes
Space losses: 3 bytes internal + 0 bytes external = 3 bytes total

开启指针压缩

# WARNING: Unable to get Instrumentation. Dynamic Attach failed. You may add this JAR as -javaagent manually, or supply -Djdk.attach.allowAttachSelf
java.lang.Object object internals:OFFSET  SIZE   TYPE DESCRIPTION                               VALUE0     4        (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4        (object header)                           00 10 00 00 (00000000 00010000 00000000 00000000) (4096)12     4        (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total[I object internals:OFFSET  SIZE   TYPE DESCRIPTION                               VALUE0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4        (object header)                           10 0c 00 00 (00010000 00001100 00000000 00000000) (3088)12     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)16     0    int [I.<elements>                             N/A
Instance size: 16 bytes
Space losses: 0 bytes internal + 0 bytes external = 0 bytes totalcom.JOLSample$A object internals:OFFSET  SIZE               TYPE DESCRIPTION                               VALUE0     4                    (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)8     4                    (object header)                           a8 e9 0d 00 (10101000 11101001 00001101 00000000) (911784)12     4                int A.id                                      016     1               byte A.b                                       017     3                    (alignment/padding gap)                  20     4   java.lang.String A.name                                    null24     4   java.lang.Object A.o                                       null28     4                    (loss due to the next object alignment)
Instance size: 32 bytes
Space losses: 3 bytes internal + 4 bytes external = 7 bytes total

通过指针压缩,类型指针、对象引用等由8字节转为4个字节。降低对象占用的内存大小,顺便减轻GC压力;当指针移动时,减少带宽损耗。


在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com