Java 为什么压缩Oops为对象头提供12个字节

Java 为什么压缩Oops为对象头提供12个字节,java,memory-layout,objectsize,Java,Memory Layout,Objectsize,这是在Java6内存模型之后。在32位JVM中,对象的浅层大小是 8 bytes (object header) + total of all instance variables + padding (optional) 如果前两个术语加起来不是8的倍数,则会有填充 在64位JVM中,浅层大小是 16 bytes (object header) + total of all instance variables + padding (optional) 我的理解是,这个对象头由两个单词组成

这是在Java6内存模型之后。在32位JVM中,对象的浅层大小是

8 bytes (object header) + total of all instance variables + padding (optional)
如果前两个术语加起来不是8的倍数,则会有填充

在64位JVM中,浅层大小是

16 bytes (object header) + total of all instance variables + padding (optional)
我的理解是,这个对象头由两个单词组成(oracle hotspot VM)

  • 克拉斯语
  • 标记词
在32位JVM上,对象头=2*32位=64位=8字节
在64位JVM上,对象头=2*64位=128位=16字节

但是使用CompresseDoop时,3个低阶位被截断,因此对于小于32 Gig的堆,64位JVM上的低阶位应该返回到8字节

但是,当我使用JOL(Java对象布局)测试对象布局时,它显示了对象头的12个字节

测试代码

public class App  {
    public static void main( String[] args )
    {
        System.out.println(System.getProperty("java.version"));
        System.out.println(VMSupport.vmDetails());
        System.out.println(ClassLayout.parseClass(A.class).toPrintable());
    } 
}

class A {
   int a; 
}
输出

1.8.0_05
Running 64-bit HotSpot VM.
Using compressed references with 3-bit shift.
Objects are 8 bytes aligned.
Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

com.layout.test.jolTesting.A object internals:
 OFFSET  SIZE  TYPE DESCRIPTION                    VALUE
      0    12       (object header)                N/A
     12     4   int A.a                            N/A
Instance size: 16 bytes (estimated, the sample instance is not available)
Space losses: 0 bytes internal + 0 bytes external = 0 bytes total

我在这里缺少的是什么来添加这些额外的4个字节?

据我所知,这是因为,与klass单词相反,标记单词不是通过使用来编码的


因此,4字节(64位压缩klass字)+8字节(标记字)=12字节(标题)

热点有8字节、12字节和16字节的对象标题。这是因为标题包含两部分:markword(关于对象的元信息)和classword(对类的引用)。在32/64位模式下,标记字占用4或8个字节。Classword“只是”引用,因此可以在64位模式下进行压缩


请参阅:

您正在使用HotSpot吗?是的,Oracle HotSpot JDK 8 VM。我已经在我的问题中添加了输出和代码,谢谢。。现在有意义了:)@andresp这是完全正确的,
CompressedOops
同时影响
klass
和普通引用。