对象的实例化、内存布局及访问定位
一、对象的实例化
(一)创建对象的方式
- 最常见的方式:new
- 使用反射创建对象:Constructor的newInstance(xxx),可以调用空参、带参的构造器
- 使用clone创建对象,需要实现Cloneable接口
- 使用反序列化:从文件中或网络中获取一个对象的二进制流
(二)从执行步骤的角度分析创建对象的流程
- 判断对象对应的类是否加载、链接、初始化:
- 为对象分配内存
-
- 如果内存规整:指针碰撞
- 如果内存不规整:虚拟机维护一个列表/空闲列表分配
- 处理并发问题:采用CAS机制保证更新的原子性,每个线程预先分配一块TLAB
- 初始化分配到的空间:所有属性设置默认值,保证对象实例字段在不赋值时可以直接使用
- 设置对象的对象头
- 执行init方法进行初始化
二、对象的内存布局

public class Customer{
int id = 1001;
String name = "linxuwu";
Account acct;
{
name = "匿名客户";
}
public Customer(){
acct = new Account();
}
}
class Account{
}
public class CustomerTest {
public static void main(String[] args) {
Customer cust = new Customer();
}
}

三、对象的访问定位
(一)JVM是如何通过栈帧中的对象引用访问到其内部的对象实例

四、面试题
(一)对象在JVM中是如何存储的?
(二)对象头信息里面有哪些东西?
(三)Java对象头有什么?


浙公网安备 33010602011771号