Java虚拟机构建对象过程小记

时间:2022-05-22 14:34:36

  Java对象的内存分布

  Java对象的构建

  Java程序中,新建对象,除了常见的new语句之外,还可以通过反射机制、Object.clone方法、反序列化以及Unsafe.allocateInstance方法来新建对象.

  其中,Object.clone方法和反序列化通过直接复制已有的数据,来初始化新建对象的实例字段。Unsafe.allocateInstance方法则没有初始化实例字段,而new语句和反射机制,则是通过调用构造器来初始化实例字段。

    以new语句为例,它编译而成的字节码将包含用来请求内存的new指令,以及用来调用构造器的invokespecial指令。

    关于构造器:

      1. 如果一个类没有定义任何构造器,Java编译器会自动添加一个无参构造器

      2. 子类的构造器需要调用父类的构造器。如果父类存在无参构造,该调用可以是隐式的,即Java编译器会自动添加对父类构造器的调用。而如果父类没有无参构造,则子类的构造器需要显式调用父类带参构造。

        显式调用,分为两种:super -- 调用父类构造器 ; this -- 调用同一个类中的其他构造器

  压缩指针

  在Java虚拟机中,每个Java对象都有一个对象头(object header),这个由标记字段和类型指针所构成。其中,标记字段用以存储Java虚拟机有关该对象的运行数据,如哈希码、GC信息以及锁信息,而类型指针则指向该对象的类。