JVM类加载过程

本文详细阐述了Java类加载的五个关键步骤:从磁盘加载到内存、验证、准备、解析(包括静态和动态链接)以及初始化。类加载机制遵循懒加载原则,只有在真正使用时才加载,且类定义并不直接触发加载。

类加载的最终目的是将磁盘的class文件解析成类元信息放到jvm内存区域。

类加载过程可以分为以下几个过程:

1.加载过程

 从磁盘查找并通过IO将class文件加载到jvm内存区域。

 class文件的编码格式是十六进制,最开始是cafe babe,标准的class文件开头。

2.验证过程

 验证文件的格式是否正确,是否被手动修改过。

 即校验class文件里的内容是否符合java虚拟机规范。

3.准备过程

 将静态变量进行初始值赋值,比如int类型赋值为0,boolean类型赋值为false。

4.解析过程

 将符号引用转变为直接引用。

 即把静态方法的符号(比如main方法的方法名,方法上的括号等)引用替换为指向该方法所在内存地址的指针,也就是静态链接。

 顺便提及动态链接,动态链接就是在运行时将符号引用替换为直接引用,比如只有在调用某个实例的非静态方法时,这个非静态方法的符号引用才会被替换为直接引用。该过程是实现多态的关键。而这些符号引用中所谓的符号,就存储在了该类的常量池中(通过javap -v xxx.class反编译之后,在输出的信息中包含一个Constant pool列表,列表中都是#开头的字面量)。

通常,java代码被编译之后,程序流程控制都与Constant pool中的符号引用息息相关,但是此时,#开头的字面量都是静态的,而一旦该类被加载进jvm内存区域后,以#开头的字面量都会被替换成指向具体存储该数据信息的内存地址的指针。

之所以在解析阶段进行静态链接,是为了提高效率,因为静态方法被加载之后,它的内存地址不会再变了。而动态链接,比如多态,或者调用的接口有不同的实现,导致真正实现类的

代码不是固定的,只有真正在程序运行过程中才能确定实现代码的具体内存位置。

5.初始化:

 对类的静态变量初始话为指定的值,执行静态代码块。

以上就是类加载的全过程。

类被加载到方法区后,有两个比较重要的信息:类加载器的引用和对应的class实例的引用。

类加载器的引用是这个类到类加载器实例的引用。

对应class实例的引用是堆中创建的一个Class类型的对象实例,作为开发人员访问方法区中类定义的入口和切入点。

jvm的类加载机制属于懒加载,也就是说运行时只有真正用到某个类时才会去加载这个类。

但是,定义某个类并不能算作使用这个类。因此类的定义并不能触发类的加载。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值