JVM 类加载机制

类加载机制

加载 —> 连接(验证 -> 准备 -> 解析)—> 初始化 —> 使用 —> 卸载

1. 加载
  1. 通过全类名获取定义此类的二进制字节流
  2. 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
  3. 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口
2. 验证
  1. class文件格式验证:class文件规范
  2. 元数据验证:语义分析,是否符合java语言规范
  3. 字节码验证:操作指令合法
  4. 符号引用验证:确保解析动作正确执行
3. 准备

为类的静态变量分配内存,并将其初始化为默认值。
(不是赋初值,final 关键字修饰的静态常量则直接赋初值,加载到方法区运行时常量池。)

4. 解析

将常量池内的符号引用替换为直接引用的过程。

5.初始化

为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化。
初始化类触发: new实例对象、访问类的静态变量、调用类的静态方法、反射调用类、子类需初始化时先初始化父类(接口同样)、mian方法类。

6. 卸载
  1. 该类的所有的实例对象都已被 GC,也就是说堆不存在该类的实例对象。
  2. 该类没有在任何地方被引用。
  3. 该类的类加载器的实例已被 GC。
### JVM 类加载机制的工作原理 JVM类加载机制是一个复杂的流程,它负责将 Java 编译后的 `.class` 文件加载到内存中并将其转化为可由 JVM 使用的 `java.lang.Class` 实例。整个过程分为多个阶段,每个阶段都有其特定的功能和作用。 #### 一、类加载器的作用与分类 类加载器是 JVM 中用于加载类文件的核心组件之一。它的主要职责是通过类的全限定名找到对应的二进制数据,并将其加载到内存中[^1]。根据功能的不同,类加载器可以划分为以下几类: - **启动类加载器 (Bootstrap ClassLoader)** 启动类加载器是由 C/C++ 实现的原生代码构成,位于 JVM 内部。它主要用于加载 Java 核心类库,例如 `rt.jar` 和其他基础资源包。由于它是 JVM 自身的一部分,因此无法直接通过 Java 程序对其进行操作[^3]。 - **扩展类加载器 (Extension ClassLoader)** 扩展类加载器继承自 `java.lang.ClassLoader`,通常会加载存放在 `$JAVA_HOME/lib/ext` 或者由系统属性 `java.ext.dirs` 指定目录中的 JAR 包[^1]。 - **应用程序类加载器 (Application ClassLoader)** 应用程序类加载器也被称为系统类加载器,负责加载用户定义的应用程序类路径(即 `-classpath` 或环境变量 `CLASSPATH`)上的类文件[^1]。 #### 二、双亲委派机制 为了保证类的安全性和一致性,在类加载过程中采用了 **双亲委派机制**。该机制规定当某个类加载器收到类加载请求时,不会立即尝试自己去完成加载工作,而是先把这个请求委托给父级类加载器处理;只有当父级类加载器无法满足需求时才会自行查找并加载所需类。 这种设计的好处在于避免重复加载相同名称但不同版本的类,从而防止潜在冲突问题的发生。 #### 三、类加载的具体流程 类加载的整体流程主要包括以下几个重要阶段: ##### 1. 加载阶段 在此阶段,JVM 将 .class 文件的内容读取至内存之中形成相应的 java.lang.Class 对象表示形式。具体来说就是从磁盘或其他存储介质获取目标类型的二进制字节流,并将其放置于方法区(Method Area)内创建一个代表此类型的对象实例[^2]。 ```python def load_class(class_name): try: with open(f"{class_name}.class", 'rb') as file: byte_stream = file.read() # Convert the binary stream into a class object within Method Area. return create_class_object(byte_stream) except FileNotFoundError: raise Exception("Class not found.") ``` ##### 2. 验证阶段 验证是为了确保所加载的类符合当前虚拟机的要求而不危害安全或造成错误行为。这一步骤涉及多种检查项目,比如元信息格式检验、语义分析以及字节码验证等[^2]。 ##### 3. 准备阶段 准备阶段为静态字段分配内存空间并设置初始值(通常是零值),但是此时并不会执行任何初始化逻辑代码[^2]。 ##### 4. 解析阶段 解析是指将常量池内的符号引用替换为直接引用的过程。包括但不限于类及接口、字段、方法等方面的解析动作[^2]。 ##### 5. 初始化阶段 最后进入初始化阶段,这是真正开始执行用户的业务逻辑的地方。在这个环节里会对所有的 static 变量赋予指定初值并且调用 static 方法块[^2]。 --- ### 总结 综上所述,JVM类加载机制不仅包含了多层次的类加载器体系结构还融入了高效的双亲委派模式以保障系统的稳定可靠运行。同时完整的五步加载流程——加载 -> 验证 -> 准备 -> 解析 -> 初始化,则进一步细化和完善了整个机制的设计思路[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whitemeen太白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值