我想知道如果 JVM 的可用 RAM 是 4GB,是否有某种方法可以让 64 位 VM 使用 8 字节对象头而不是 12 字节对象头。
或者说在 Linux 上是这样的,如果不是在 Windows 上的话?有人可以用这段代码测试一下吗?
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class ObjectSizes {
String s1;
String s2;
public static void main(String[] args) throws Exception {
Unsafe unsafe;
try {
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (Unsafe)field.get(null);
} catch (Exception ex) {
throw new RuntimeException("Can't get Unsafe instance.", ex);
}
Field s1Field = ObjectSizes.class.getDeclaredField("s1");
Field s2Field = ObjectSizes.class.getDeclaredField("s2");
long s1OffSet = unsafe.objectFieldOffset(s1Field);
long s2OffSet = unsafe.objectFieldOffset(s2Field);
System.out.println("We are running "+System.getProperty("java.version"));
System.out.println("Object header size is "+s1OffSet+" bytes.");
System.out.println("Object reference size is "+(s2OffSet-s1OffSet)+" bytes.");
}
}
看起来 64 位 JVM 上不可能有 8 字节的对象头。标头由“标记字”、指向对象类的指针、数组大小(如果是数组)以及到达下一个 8 字节边界的填充组成。
,------------------+------------------+------------------ +---------------.
| mark word | klass pointer | array size (opt) | padding |
`------------------+------------------+-------------------+---------------'
- 标记字可用于存储本机指针实现锁并帮助GC,所以在64位JVM上占用8个字节。
- 对于小于 32GB 的堆,指向对象类的指针被压缩为4字节.
- 填充可用于存储字段之一。
因此,64 位系统上的对象头可以占用少至 8 + 4 = 12 字节,但不能更少。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)