class文件加载到内存

张开发
2026/5/23 5:54:06 15 分钟阅读
class文件加载到内存
‌JVM将class文件加载到内存的过程主要分为三个阶段加载Loading、链接Linking和初始化Initialization‌其中链接又细分为验证、准备、解析三个步骤 。一、加载Loading这是类加载过程的第一步由类加载器ClassLoader完成主要完成以下三件事获取字节流‌通过类的全限定名如 java.lang.String从本地文件系统、JAR包、网络或其他来源读取 .class 文件的二进制字节流 。转换存储结构‌将字节流所代表的静态结构转换为方法区JDK 8 后为元空间中的运行时数据结构 。创建Class对象‌在堆中生成一个 java.lang.Class 对象作为方法区中该类元数据的访问入口 。⚠️ 数组类的加载方式特殊数组类本身不由类加载器创建而是由JVM直接生成但其元素类型仍需通过类加载器加载 。二、链接Linking链接阶段确保类的正确性与安全性分为三个子阶段验证Verification确保 .class 文件的字节流符合JVM规范防止恶意代码危害虚拟机。包括‌文件格式验证‌检查魔数 0xCAFEBABE、主次版本号等‌元数据验证‌检查语义合法性如继承关系是否正确‌字节码验证‌确保指令流逻辑合理操作数栈类型匹配‌符号引用验证‌检查常量池中引用的类、方法是否存在 。准备Preparation为类的‌静态变量‌static 变量分配内存并设置默认初始值零值public static int value 123; → 此阶段 value 0public static final int VALUE 123; → 因是编译期常量此阶段直接赋值为 123 。内存分配位置JDK 7 前在方法区JDK 8 起移至堆中元空间不存储类静态变量。解析Resolution将常量池中的‌符号引用‌转换为‌直接引用‌符号引用以字符串形式表示的类、方法、字段名如 java/lang/Object.toString()直接引用指向内存地址的指针或偏移量解析可在初始化前或后执行支持动态绑定晚期绑定。三、初始化Initialization这是类加载的最后一步也是真正开始执行Java代码的阶段执行类构造器 () 方法为静态变量赋予程序指定的初始值执行静态代码块触发条件包括创建对象实例new、访问静态字段非 final、调用静态方法、反射使用类、子类初始化导致父类先初始化、启动主类含 main 方法等 。初始化遵循“父类优先”原则若子类初始化父类必须先完成初始化 。

更多文章