Skip to content

对象初始化流程

从JVM和底层角度来看,Java对象的初始化流程涉及到类加载、内存管理、对象布局、以及字节码执行等多个方面。以下是详细的分析:

1. 类加载(Class Loading)

  • 启动类加载器(Bootstrap ClassLoader):负责加载Java核心类库(rt.jar)。
  • 扩展类加载器(Extension ClassLoader):加载Java扩展类库(jre/lib/ext)。
  • 应用类加载器(Application ClassLoader):加载应用程序的类路径(classpath)中的类。
  • 自定义类加载器(Custom ClassLoader):允许开发者自定义类加载行为。
  • JVM采用懒加载的方式,只有在首次使用某个类时才会加载该类。

2. 类的链接(Linking)

  • 验证(Verification):确保字节码文件的正确性和安全性。
  • 准备(Preparation):为类的静态变量分配内存并设置默认初始值。注意,这里的初始值是JVM默认值,例如int类型的静态变量默认初始化为0
  • 解析(Resolution):将常量池中的符号引用替换为直接引用,例如将类名解析为具体的类对象。

3. 类的初始化(Initialization)

  • 执行静态初始化块和静态变量的初始化。
  • 如果类包含静态代码块或静态变量初始化,这些代码在类加载后立即执行。

4. 内存分配(Memory Allocation)

  • JVM为新对象在堆上分配内存。具体的内存分配方式可能依赖于垃圾收集器的实现(如Serial, Parallel, CMS, G1等)。
  • TLAB(Thread-Local Allocation Buffer):JVM可能使用TLAB机制为每个线程预分配一小块堆内存以加速对象创建。小对象通常会直接在TLAB中分配,大对象则可能直接在堆上分配。

5. 对象布局(Object Layout)

  • 对象头(Object Header):包括两部分内容:
    • Mark Word:存储对象的哈希码、GC标记、锁状态等信息。
    • Class Pointer:指向对象的类元数据,表明这个对象是哪个类的实例。
    • Array Length:如果对象是数组,还会包含数组的长度信息。
  • 实例数据(Instance Data):存储对象的实例变量。不同变量的排列顺序受JVM实现影响,通常遵循内存对齐策略。
  • 对齐填充(Padding):JVM为了满足内存对齐的要求,可能会在对象末尾填充一些无意义的数据,使对象的大小是内存对齐的倍数(通常是8字节)。

6. 对象的默认初始化

  • JVM对内存区域进行零值初始化。这个步骤确保所有实例变量都有默认值:
    • 基本数据类型:例如int0float0.0
    • 引用类型:例如Stringnull
  • 这个过程是在堆上进行的。

7. 对象的显式初始化

  • JVM执行代码中定义的初始化值。例如int a = 10;这种初始化会在默认初始化之后进行。

8. 构造代码块初始化和构造函数调用

  • JVM执行类中的构造代码块(如果有),这一步在构造函数之前执行。
  • 接着,JVM执行构造函数。构造函数通常会进行以下操作:
    • 隐式调用父类构造函数:通过super()调用父类的构造函数。如果没有显式调用super(),JVM会默认插入一个无参的super()调用。
    • 构造函数代码执行:在父类构造函数执行完后,执行当前类构造函数中的代码。

9. 对象引用的返回

  • 对象构造完成后,JVM返回对象的引用(即指针),通常存储在栈帧的局部变量表中。
  • 如果对象是由某个方法创建的,那么该方法的返回值就是对象引用。

10. 即时编译(JIT Compilation)和字节码执行

  • JVM采用解释执行和即时编译(JIT)结合的方式来执行字节码。
  • 对象的构造函数和初始化代码首先以字节码形式被解释执行,如果JVM检测到这些代码是热点代码,则会触发JIT编译,将字节码编译为本地机器代码,以提高执行效率。

11. 垃圾回收(Garbage Collection)

  • 当对象不再被引用时,垃圾收集器会回收其占用的内存。
  • Java垃圾收集器有多种实现方式,如标记-清除(Mark-Sweep)、标记-整理(Mark-Compact)、复制算法(Copying)、分代收集等。

总结

从JVM和底层的角度看,Java对象初始化是一个复杂的过程,涉及到类加载、内存分配、对象布局和字节码执行等多个步骤。每一个步骤都与JVM的设计和实现紧密相关,确保了Java的跨平台性和高效性。

Released under the MIT License.