类的加载过程
从加载到使用需要经过加载-连接-初始化-使用-销毁
详细讲
加载:从开发的.java文件由javac编译成.class文件,然后jvm把.class文件转换成某种静态数据结构存储到方法区,并生成可以被使用的java.long.class对象存放到堆中。
连接又划分为 验证-准备-解析三个步骤
验证:是对文件格式,元数据和字节码、以及符号引用做相应的验证,但是文件格式的验证其实是发生在加载阶段,文件格式正确才会继续加载,元数据和字节码就是对class静态结构进行语法和语义上的验证,保证不会产生危害jvm的行为,在元数据和字节码验证通过后,会暂时认为该class是安全的,还有一道对符号引用的验证是在解析阶段进行的。我们也可以发现这些验证其实是分散在不同的环节的。
准备:准备阶段是对class对象的静态变量进行赋值的操作,值类型赋0,引用类型赋null
解析:是对class中的符号引用替换成直接引用的过程。
解析又分为静态解析和动态解析:
静态解析是class中调用的是一个具体的实现类,假设有A B两个class A引用B 当A发生类加载时发现B没有加载,就会触发B的类加载,加载完成后会吧A中的符号引用替换成B的实际地址,这称为直接引用,也就是静态加载。
动态加载是当class所引用的是接口或者抽象类,并不是具体的类,这时候就等在实际的运行过程中发生了调用,此时再进行解析就能明确的替换为引用的实际地址,这也是为什么解析有时会发生在初始化之后的原因。
初始化:会判断代码中是否有主动的资源初始化操作,比如成员变量 静态变量的赋值动作,以及静态代码块的逻辑加载。
元数据:class的描述信息包括版本、属性、方法、接口等描述信息。
引用关于大佬的jvm介绍
https://www.zhihu.com/question/456438264/answer/2406849899