对象的内存布局
- 对象头(Head)
- 运行时元数据:Hash值(HashCode)、GC分代年龄、锁状态标志、线程只有的锁、偏向线程ID、偏向时间戳
- 类型指针:指向元数据InstanceKlass,确定该对象所属的类型
- 如果创建的数组,还需要记录数组的长度
- 实例数据(Instance Data):对象真正存储的有效信息,包括代码汇总定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段)
- 相同宽度的字段被分配到一起、父类中定义的变量会出现在子类之前、如果CompactFields参数为true(默认为true):子类的窄变量可以插入到父类的变量空隙
- 对其填充(Padding):不是必须的,也没特别含义,仅仅起到占位符的作用
实例代码
public class Customer {
int id = 1001;
String name;
Account acct;
{
name = "匿名客户";
}
public Customer() {
acct = new Account();
}
}
class Account {
}
public class TestCustomer {
public static void main(String[] args) {
Customer cust=new Customer();
}
}
图例
其他
文章中的图是通过Process On制作。好工具一定要分享给最好的朋友,ProcessOn助您和好友一起高效办公!https://www.processon.com/i/5f4856585653bb0c71db8c97