类加载过程是怎样的?

JVM 面试题发布于

一、五个阶段

  1. 加载:通过类的全限定名获取二进制字节流,在内存中生成 Class 对象。
  2. 验证:校验字节码的合法性(魔数、版本、语义)。
  3. 准备:为类的静态变量分配内存并赋默认值(零值),final static 在编译期已赋值。
  4. 解析:把符号引用替换为直接引用。
  5. 初始化:执行 <clinit> 方法,给静态变量赋程序设定的初始值,执行静态代码块。

二、双亲委派模型

加载器收到请求先委托给父加载器,父加载器找不到才自己加载。

  • 启动类加载器(Bootstrap):rt.jar
  • 扩展类加载器(Ext):jre/lib/ext
  • 应用类加载器(App):classpath

好处:避免核心类被篡改,保证类的唯一性。

三、主动引用触发初始化

new 对象、访问静态变量、调用静态方法、反射、初始化子类时父类先初始化。