JVM类加载整体流程

176 阅读2分钟

大多数我们把类加载的过程分为:加载-链接{验证-准备-解析}-初始化 这个说法也没错,但是从细节上来说这个流程有一些太绝对是错误的。

具体流程可以分为7-8步: 加载-验证-加载-加载-验证-验证-准备-初始化。 好像丢了一个解析?因为我们不知道具体在哪一步,接下来我们来具体分析它的流程。 第一步加载: 这一步是一个静态加载,当Java文件编译成Class文件二进制字节流之后进行第一次加载,这是个静态加载,获得的是一个Class文件字节流 ———第二步直接进入到链接里面的验证,验证里面的第一步:文件格式验证(Class文件里面的魔数和主次版本号)————第三步又回到加载(验证完成后发现他是个JVM能够支持的Class文件并且版本号符合兼容性,这个时候我们就需要将Class文件二进制字节流静态文件加载转化到方法区,转化到方法区之后会有一个结构的调整-静态存储文件转换为运行时数据结构)————第四步加载 (在Java堆内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。比如说Object类,这个类一定是先加载的。。。)————第五步又回到链接里面的验证里面的第二步:元数据验证。————第六步到验证里面的第三步:字节码验证。验证完成之后————第七步准备(零值的初始化)为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值————第八步初始化 。 解析是一种游离性的状态,从第一步开始解析可能已经开始了。那么解析代表什么呢? 我们可以发现验证有四步我们现在却只用到了三步,那么还有一步呢? 其实 我们的解析就是链接里面的验证里面的第四步:符号引用验证。解析的作用是将符号引用转化为直接引用。可能是随着类加载一直在做的,但是我们可以确定一点 解析这一步肯定是在初始化完成之前的 。但是解析具体参差在之前的哪一步?这个还没有完整全面的定义。。。