对象的实例化、内存布局及访问定位

一、对象的实例化

(一)创建对象的方式

  1. 最常见的方式:new
  2. 使用反射创建对象:Constructor的newInstance(xxx),可以调用空参、带参的构造器
  3. 使用clone创建对象,需要实现Cloneable接口
  4. 使用反序列化:从文件中或网络中获取一个对象的二进制流

(二)从执行步骤的角度分析创建对象的流程

  1. 判断对象对应的类是否加载、链接、初始化:
  2. 为对象分配内存
    • 如果内存规整:指针碰撞
    • 如果内存不规整:虚拟机维护一个列表/空闲列表分配
  1. 处理并发问题:采用CAS机制保证更新的原子性,每个线程预先分配一块TLAB
  2. 初始化分配到的空间:所有属性设置默认值,保证对象实例字段在不赋值时可以直接使用
  3. 设置对象的对象头
  4. 执行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对象头有什么?

 

 

posted @ 2020-11-02 22:48  wulinsam  阅读(84)  评论(0)    收藏  举报