对象内存布局
一 对象内存布局
二 对象头
对象头包含了两部分:运行时元数据(Mark Word)和 类型指针。
如果是数组,还需要记录数组的长度。
1 运行时元数据
- 哈希值(HashCode)
- GC分代年龄
- 锁状态标志
- 线程持有的锁
- 偏向线程ID
- 偏向时间戳
2 类型指针
指向类元数据 InstanceClass,确定该对象所属的类型。指向的其实是方法区中存放的类元信息。
三 实例数据(Instance Data)
四 对齐填充
不是必须的,也没有特别的含义,仅仅起到占位符的作用。
五 小结
六 实战
1 代码
/**
* 测试对象实例化的过程
* ① 加载类元信息
* ② 为对象分配内存
* ③ 处理并发问题
* ④ 属性的默认初始化(零值初始化)
* ⑤ 设置对象头的信息
* ⑥ 属性的显式初始化、代码块中初始化、构造器中初始化
*
* 给对象的属性赋值的操作:
* ① 属性的默认初始化
* ② 显式初始化 / ③ 代码块中初始化 这两个按在代码中出现的顺序进行初始化
* ④ 构造器中初始化
*/
public class Customer{
// 占4个字节,显式初始化
int id = 1001; // 它的默认初始化是 0
// 引用占4个字节
String name; // 它的默认初始化是 null
// 引用占4个字节
Account acct; // 它的默认初始化是 null
{
// 代码块中初始化
name = "匿名客户";
}
public Customer(){
acct = new Account();
}
}
class Account{
}
public class CustomerTest {
public static void main(String[] args) {
Customer cust = new Customer();
}
}
还没有评论,来说两句吧...