
执行Object o = new Object();
执行步骤角度:
判断对象是否加载、链接、初始化,然后加载类元信息:
ClassLoader+包名+类名为key找对应的class文件ClassNotFoundException异常;找到就加载类并生成相应的class类对象为对象分配内存: 先计算对象占用空间大小,在堆中划分内存给该对象。如果实例成员变量是引用变量,则仅分配引用变量空间即可(4/8个字节)
处理并发问题:
初始化分配的空间: 所有属性设置默认值
设置对象的对象头:将对象所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象头中
执行init方法进行初始化(注意方法是对静态属性进行初始化):包括显示初始化、代码块中初始化以及构造器中初始化
创建完对象后,该对象在堆空间的内存布局如下:

执行
Customer c = new Customer();的内存布局:public class Customer{ int id = 1001; String name; Account acct; { name = "匿名用户"; } public Customer{ acct = new Account(); } } class Account{}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12

JVM是如何通过栈帧中的对象引用访问到其内部的对象实例?


1.对象在JVM如何存储?
2.对象头有什么内容?