Java 程序的执行过程
Tips:
对于java程序的执行的过程,参考了两张图片来理解,并主要参照图2进行讲解!(这里不对具体的内容进行详细讲解,对于具体的内容,将给出参考的链接)
图 1:JVM Model
图 2:Java 运行流程
java的执行可以分为编译和运行两个阶段,分别对应着图2的左侧和右侧部分这部分我们将侧重运行阶段的介绍。
- 编译:将合法的
.java
文件翻译成字节码(bytecode)文件.class
。其中包含着检查、分析(词法,语法,语义),优化等流程。
https://www.cnblogs.com/code-duck/p/13568092.html - 运行:运行阶段的整个流程可以分为加载阶段(loader),链接阶段(linking),初始化阶段(intialization)、解释执行阶段(interpreter)。参照图 1的JVM模型,可知,加载、链接、初始化和解释执行之间是通过运行时数据区域进行交互的(runtime data area)
- 加载阶段:将字节码文件加入到内存中JVM的方法区(Methods Area)。
- 链接阶段:主要包含验证(保证加载类的正确性)、准备(为类变量分配内存并设置类变量的初始值)、解析(将常量池中的符号引用替换为直接引用)三个阶段。
- 初始化阶段:若该类具有超类,则对其进行初始化,执行静态初始化器(成员变量也会被初始化)。
Tip:
加载、链接、初始化的详细了解可以参考如下链接:
https://blog.csdn.net/qq_32238611/article/details/114546719
关于JVM方法区维护的类信息及其他区域维护的信息可以参考如下链接:
https://blog.csdn.net/yfqnihao/article/details/8289363
- 执行阶段:JVM将定位
public static void main(String[] args)
,JVM按照main()
方法的代码进行逐行执行。
Tips:
- JVM内存简单介绍:
方法区:在加载阶段,只将类加载到方法区(故方法区中还包含常量池等),
堆:具体实例的创建是在程序运行时(实例创建被放在堆内存中)
栈:方法运行过程中的局部变量
PC寄存器:记录程序执行的位置。
本地方法栈:指使用到的本地方法。
①PC寄存器、本地放法栈和栈 是线程对立的。
②JVM在操作系统层面为操作系统的堆区,因此可以实现捕获异常等优势
2. 解释执行过程
解释执行包含JIT、AOT等诸多技巧,但是不同的技巧有着不同的优势和应用场景。
Blog Reference
https://www.cnblogs.com/linj7/p/14122919.html
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.1
https://javaguide.cn/java/basis/java-basic-questions-01.html#什么是字节码-采用字节码的好处是什么