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));