java源文件编写完成之后,点击run方法开始执行到最终执行结束经历了什么呢?我们来仔细看看:
第一:编译
java源文件经过jvm编译器编译形成.class字节码文件,字节码文件包含了两个部分的内容,第一部分是常量池,记录了所有的常量,成员变量,符号引用等信息;第二部分是类中各个方法对应的字节码文件;我们将字节码文件进行反编译查看,具体如下图所示:
第二:运行阶段
运行是一个比较复杂的过程,里面包含了诸多小步骤,简单的说:运行包括了类的加载,准备阶段(验证,准备,解析),初始化,执行,卸载!
加载步骤即:jvm虚拟机将类的字节码文件加载到内存中;
验证阶段即:jvm对类的class字节码文件进行验证,确定所加载的字节码文件与虚拟机之间是匹配的并且不会危害虚拟机的运行安全;
准备阶段即:jvm为类中的静态变量开辟存储空间并且将这些静态变量初始化为其默认值,并不是代码中直接赋予的值,该步骤仅仅分配存储空间并且初始化为默认值,没有实例化的对象;
解析阶段即:jvm对类中的符号引用进行替换,将这些符号引用替换为直接引用,符号应用就是我们在字节码文件中定义的变量以及方法名称这些标识符,直接引用就是这些标识符对应的内存指针;
第三:初始化阶段:
初始化就是对内存中已经存在的静态变量赋予正确的初始值,即我们自己定义的静态变量的值;
第四步:运行阶段:
jvm从main方法开始进行代码的执行,遇到引用类,就去方法区中寻找该类的字节码文件,之后在堆区中实例化该类的对象,并将该实例化对象与方法区中的字节码内容和常量池内容进行绑定;实例化结束之后,根据代码中直接引用去寻找堆中的对象,由堆中的对象寻找该字节码中对应方法的存放位置,然后进行执行;
第五步:卸载阶段:
当类的对象生命周期结束,并且对应的类加载器也结束,即进入字节码文件卸载阶段