java object多大 java对象内存模型 数组有多长(三)各jvm环境

在之前的程序中,考虑到hotspot java11 Unsafe包的不可达(最近发现zing 11能访问),搞出来手动定义的

但并没有意义,手动定义通常基于hotspot,并不能适用用于其它jvm,unsafe里的偏移或reference信息本身就是jvm具体实现的,手动定义相当于脱离了真实线上环境,不可取

在实际场景中 还是要力图touch到unsafe包

而且在哪里有padding完全取决于jvm版本实现

 

windows java 8

-XX:-UseCompressedClassPointers -XX:-UseCompressedOops

System.out.println(unsafe.arrayIndexScale(Object[].class));
System.out.println(unsafe.arrayBaseOffset(Object[].class));
System.out.println(unsafe.objectFieldOffset(fieldFirst));

8

24

16

 

开启指针压缩-XX:+UseCompressedClassPointers -XX:+UseCompressedOops

4

16

12

 

zing 11

8

16 数组对象头16

8 非数据对象头8

 

可以看到zing大内存下对象头比较小(数组+对象)

System.out.println(unsafe.arrayIndexScale(Object[].class));
System.out.println(unsafe.arrayBaseOffset(Object[].class));
System.out.println(unsafe.objectFieldOffset(fieldFirst));

posted on 2024-06-01 22:46  silyvin  阅读(1)  评论(0编辑  收藏  举报