JVM的类加载过程

classloader准备一个类大致分为三步:
1 加载
查找并加载类的class文件的二进制数据到内存中,将其存放在运行时数据区的方法区内,然后在堆区创建一个Class对象,用来封装在方法去内的数据结构
2 链接
将已经读入到内存中的类的二进制数据合并到虚拟机的运行时环境中去
(1)验证:确保被加载类的正确性,包括类文件结构检查,语义检查,字节码验证,二进制兼容性验证
(2)为类的静态变量分配内存,并将其初始化为默认值
(3)把类中的符号引用转换为直接引用
3 初始化
为类的静态变量赋予正确的初始化值

JVM规范要求虚拟机在每个类或接口被java程序主动使用时才初始化他们,而类加载器并不需要在类被主动使用时才加载它。JVM规范允许类加载器在预料到某个类将被使用时预先加载它,如果加载过程中遇到class文件缺失或存在错误,类加载器必修在程序首次主动使用该类时再报告链接错误(LinkageError)。如果这个类一直没有被程序主动使用,类加载器就不会报告错误。

主动使用包括以下情况:
(1)创建实例
(2)访问静态变量或静态方法,不包括static final的编译时常量和通过子类引用子类可见的父类静态变量或方法
(3)反射,Class.forName()
(4)初始化一个类的子类,不适用接口
(5)JVM启动时标明的启动类

JVM初始化一个类时,会先递归初始化它所有的父类,但并不包括接口。同样,初始化一个接口也不会递归初始化其父接口。只有当程序首次使用一个接口的静态变量时,才会初始化该接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值