JVM详解之类加载器究竟做了什么

本文详细介绍了JVM中的类加载器,包括加载、链接和初始化三个阶段。加载过程涉及字节码文件的获取、方法区的数据结构转化及Class对象的生成。链接阶段包括验证、准备和解析,确保类的安全性和正确性。初始化则执行类构造器方法<clinit>()。类加载器分为引导类加载器和自定义类加载器,保证类的唯一加载和线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVM就是Java Virtual Machine ,Java 虚拟机

Java之所以能够实现一次编译,多次运行(Write Once,Run anywhere),就是因为JVM,其第一次编译生成了字节码文件(classFile),接下来只需在有JVM环境的任何操作系统上都可以运行

在Java虚拟机中,也就是JVM中,首要的就是类加载器,其首先对字节码文件进行加载,链接,初始化操作。

加载

加载过程

1.通过一个类的权限定名获取定义此类的二进制字节流

2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构

3.在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口

注意

ClassLoader 只负责class文件的加载,至于是否可以运行,具体由Execution Engine来决定

不管是什么样的字节码文件,在开头都会有特定的文件标识,在二进制字节流中,就是CA FE BA BE。

加载的类信息存放于内存中的内存空间的方法区中,其中还包括了运行时的常量池信息。

如果装载的时候失败了,就会抛出异常,否则就会进入链接阶段

链接

链接过程

验证(Verify)

验证被加载的类的准确性,保证安全,不被恶意修改

有四种验证方式,文件格式验证,元数据验证,字节码验证,符号引用验证

准备(Prepare)

为类变量分配内存并且设置该类变量的默认初始值,也就是零值,即在准备阶段,类的变量都会是默认值,只有到了初始化阶段(initization),才会赋值

如果用final修饰的static变量,那么在这个阶段,就会显示初始化,因为final在编译的时候就分配了空间和值

解析(Resolve)

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

解析伴随着初始化执行完之后再执行

在程序中,我们通常会用到一些这样那样的类,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值