我想知道是否有办法让64位VM使用8字节对象头而不是12字节对象标头,如果JVM的可用RAM是4GB的话。
或者,在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.");
}
}发布于 2013-06-27 16:24:46
看起来,在64位JVM上不可能有一个8字节的对象头。标头由一个“标记字”、指向对象类的指针、数组大小(如果是数组)和填充(以到达下一个8字节的边界)组成。
,------------------+------------------+------------------ +---------------.
| mark word | klass pointer | array size (opt) | padding |
`------------------+------------------+-------------------+---------------'因此,64位系统上的对象头可以占用8+4= 12字节,但不少于12字节。
发布于 2014-01-26 08:31:45
对于64位VM,有一些选项:
在这种情况下:对象头为12字节,数组头为16字节(数组大小为最后4字节)。
2.不通过-XX使用压缩指针:-UseCompressedOops
在这种情况下:对象头为16字节,数组头为20字节(数组大小为最后4字节)。
上面给出的代码不是VM比特大小独立的,对于32位和64位vms会给出不同的结果。您需要考虑位度和压缩oops因素来计算正确的大小。
发布于 2015-02-11 16:09:58
通过-XX:+UseCompressedOops使用压缩指针(默认情况下在Java6上启用)
这并不适用于所有版本的Java 6。默认情况下,从Java6u25开始启用-XX:+UseCompressedOops。
https://stackoverflow.com/questions/17335884
复制相似问题