繁体   English   中英

Java上的对象头大小,64位VM,内存小于4GB

[英]Object header size in Java on 64bit VM with <4GB RAM

我想知道是否有一些方法让64位VM使用8byte对象头而不是12byte对象头,如果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.");
    }
}

它看起来不像在64位JVM上有一个8字节的对象头。 标题包含一个“标记字”,一个指向对象类的指针,一个数组的数组大小,以及到达下一个8字节边界的填充。

  ,------------------+------------------+------------------ +---------------.
  |    mark word     |   klass pointer  |  array size (opt) |    padding    |
  `------------------+------------------+-------------------+---------------'

因此,64位系统上的对象标头可以占用8 + 4 = 12个字节,但不能少。

对于64位VM,有以下选项:

  1. 通过-XX使用压缩指针:+ UseCompressedOops(在Java 6上默认启用)

在这种情况下:对象头将是12个字节,数组头将是16个字节(最后4个字节的数组大小)

2.不通过-XX使用压缩指针:-UseCompressedOops

在这种情况下:对象头将是16个字节,数组头将是20个字节(最后4个字节的数组大小)

上面给出的代码不是VM位大小独立的,并且将为32位和64位vms提供不同的结果。 您需要考虑位和压缩的oops因子来计算正确的大小。

通过-XX使用压缩指针:+ UseCompressedOops(在Java 6上默认启用)

对于所有版本的Java 6 -XX:+UseCompressedOops是这样。- -XX:+UseCompressedOops默认情况下启用-XX:+UseCompressedOops ,从Java 6u25开始

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM