java类加载过程

简介

我们知道java程序运行时,.java文件会被编译器变成成.class文件。

类加载机制指的是将这些.class文件中的二进制数据读入到内存中,并对数据进行校验,解析和初始化。

最终,每一个类都会在方法区保存一份它的元数据,在堆中创建一个与之对应的Class对象。

在这里插入图片描述
类加载主要用三个阶段:加载、连接、初始化

1.加载(Loading)

将不同的数据源(class文件、jar包、网络)转化为二进制字节流读入内存,并由类加载器生成java.lang.Class对象。

2.连接(Linking)

将类的二进制数据合并进JRE中。
连接可以分为:验证、准备、解析三个阶段。

1)验证:确保Class文件字节流符合当前虚拟机的要求,并且不会危机安全
对.class文件的文件格式、元数据、字节码、符号引用进行校验。

2)准备:静态默认初始化
给静态变量分配内存、进行默认初始化。

3)解析
jvm将常量池的符号引用替换成直接引用。简单的说将变量用能够解析的地址来代替。

什么是符号引用?
Java代码在编译期间,是不知道最终引用的类型,具体指向内存中哪个位置的,这时候会用一个符号引用,来表示具体引用的目标是"谁"。Java虚拟机规范中明确定义了符号引用的形式,符合这个规范的前提下,符号引用可以是任意值,只要能通过这个值能定位到目标。
什么是直接引用?
直接引用就是可以直接或间接指向目标内存位置的指针或句柄。

3.初始化

主要针对静态成员(类加载阶段),执行显示初始化进行赋值操作。
此阶段主要是执行clinit()方法,依次自动收集静态变量的赋值操作静态代码块中的语句并合并。

jvm会保证clinit()方法在多线程情况下正确的执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值