首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >64位VM上Java中的对象标头大小( <4GB RAM )

64位VM上Java中的对象标头大小( <4GB RAM )
EN

Stack Overflow用户
提问于 2013-06-27 06:22:14
回答 3查看 4.2K关注 0票数 10

我想知道是否有办法让64位VM使用8字节对象头而不是12字节对象标头,如果JVM的可用RAM是4GB的话。

或者,在Linux上,如果不是在windows上,情况会是这样吗?有人能用这段代码来测试这个吗?

代码语言:javascript
复制
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.");
    }
}
EN

回答 3

Stack Overflow用户

发布于 2013-06-27 16:24:46

看起来,在64位JVM上不可能有一个8字节的对象头。标头由一个“标记字”、指向对象类的指针、数组大小(如果是数组)和填充(以到达下一个8字节的边界)组成。

代码语言:javascript
复制
  ,------------------+------------------+------------------ +---------------.
  |    mark word     |   klass pointer  |  array size (opt) |    padding    |
  `------------------+------------------+-------------------+---------------'
  • 标记字可用于存储本机指针to implement locks and to help GC,因此它在64位JVM上占据8个字节。
  • 堆小于32‘s时,指向对象的类is compressed to 4 bytes的指针。
  • 所述填充可用于存储所述字段之一。

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

票数 17
EN

Stack Overflow用户

发布于 2014-01-26 08:31:45

对于64位VM,有一些选项:

  1. 通过-XX:+UseCompressedOops使用压缩指针(默认情况下在Java6上启用)

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

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

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

上面给出的代码不是VM比特大小独立的,对于32位和64位vms会给出不同的结果。您需要考虑位度和压缩oops因素来计算正确的大小。

票数 4
EN

Stack Overflow用户

发布于 2015-02-11 16:09:58

通过-XX:+UseCompressedOops使用压缩指针(默认情况下在Java6上启用)

这并不适用于所有版本的Java 6。默认情况下,从Java6u25开始启用-XX:+UseCompressedOops

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17335884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档