JVM 从入门到入土 ③:对象布局

关于对象面试题:

对象大小(64 位机)

观察虚拟机配置

java -XX:+PrintCommandLineFlags -version

普通对象

  1. 对象头:markword  8 字节
  2. ClassPointer 指针:-XX:+UseCompressedClassPointers 压缩打开为 4 字节,不开启为 8 字节
  3. 实例数据
    1. 引用类型:-XX:+UseCompressedOops 为 4 字节 不开启为 8 字节
      Oops Ordinary Object Pointers
  4. Padding 对齐,8 的倍数

数组对象

  1. 对象头:markword 8 字节
  2. ClassPointer 指针同上
  3. 数组长度:4 字节
  4. 数组数据
  5. 对齐 8 的倍数

实验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.mashibing.jvm.c3_jmm;

import com.mashibing.jvm.agent.ObjectSizeAgent;

// -XX:+UseCompressedClassPointers:类型指针压缩
// -XX:+UseCompressedOops:对象引用指针压缩
public class T03_SizeOfAnObject {
public static void main(String[] args) {
System.out.println(ObjectSizeAgent.sizeOf(new Object())); // 16=8+4+4(补齐)
System.out.println(ObjectSizeAgent.sizeOf(new int[] {})); // 16=8+4+4
System.out.println(ObjectSizeAgent.sizeOf(new P())); // 32
}

private static class P {
//8 _markword
//4 _class pointer -XX:+UseCompressedClassPointers
int id; //4
String name; //4 _oops pointer -XX:+UseCompressedOops
int age; //4

byte b1; //1
byte b2; //1

Object o; //4
byte b3; //1

}
}

markword

IdentityHashCode

死磕 Synchronized 底层实现,面试你还怕什么?
面试题深入解析:Synchronized 底层实现
死磕 Synchronized 底层实现 – 重量级锁
一文让你读懂 Synchronized 底层实现,秒杀面试官

对象定位

访问对象两种方式 – 句柄和直接指针

  1. 句柄池
  2. 直接指针