描述一下JVM加载class文件的原理机制?
1 个回答
首先你要快乐,其次都是其次。白菜### JVM 加载 Class 文件的原理机制 #### 类的装载过程 JVM 中的类装载由类加载器(ClassLoader)及其子类实现。类加载器是 Java 运行时系统的重要组件,负责在运行时查找和装入类文件中的类。Java 程序经过编译后生成的 .class 文件不是可执行程序,而是字节码。当 Java 程序需要使用某个类时,JVM 会确保该类已经被加载、连接(验证、准备和解析)和初始化。 #### 类加载的步骤 1. **加载(Loading)** - 把类的 .class 文件中的数据读入内存,通常是通过创建一个字节数组来读取 .class 文件,然后产生与所加载类对应的 Class 对象。 - 加载完成后,Class 对象还不完整,此时的类还不可用。 2. **连接(Linking)** - **验证(Verification)**:确保类文件的字节码符合 JVM 的要求,保证不会危害 JVM 的安全。 - **准备(Preparation)**:为静态变量分配内存,并设置默认的初始值。 - **解析(Resolution)**:将符号引用替换为直接引用。 3. **初始化(Initialization)** - 如果类存在直接的父类且这个类还没有被初始化,则先初始化父类。 - 如果类中存在初始化语句,依次执行这些初始化语句。 #### 类加载器 类的加载是由类加载器完成的,类加载器包括: - **根加载器(Bootstrap ClassLoader)** - **扩展加载器(Extension ClassLoader)** - **系统加载器(System ClassLoader)** - **用户自定义类加载器(ClassLoader 的子类)** 从 Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。 #### 父亲委托机制(PDM) - **原理**:类加载器在加载类时首先将请求委托给父类加载器进行加载。只有当父类加载器无法完成加载任务时,子类加载器才会尝试自行加载。 - **优点**:保证了 Java 平台的安全性,防止核心类库被篡改。 #### 各类加载器说明 1. **Bootstrap ClassLoader** - 一般用本地代码实现,负责加载 JVM 基础核心类库(如 rt.jar)。 - 是 JVM 自带的根加载器。 2. **Extension ClassLoader** - 从 `java.ext.dirs` 系统属性指定的目录中加载类库。 - 父加载器是 Bootstrap ClassLoader。 3. **System ClassLoader** - 又称应用类加载器,从环境变量 `classpath` 或系统属性 `java.class.path` 指定的目录中加载类。 - 是用户自定义类加载器的默认父加载器,其父类是 Extension ClassLoader。 通过这些步骤和机制,JVM 能够有效地管理类的加载和初始化,确保程序的正确运行和系统的安全性。发布于 2024-07-05 01:44 •IP属地 北京举报评论收藏
公众号进入网站体验更佳

