Java 程序执行过程
Java 程序的执行过程
图 1:JVM Model 图 2:Java 运行流程
根据图 2,java的执行可以分为编译和运行两个阶段,分别对应着图2的左侧和右侧部分这部分我们将侧重运行阶段(更详细的过程参考图 1)的介绍。(这里不对具体的内容进行详细讲解,对于具体的内容,将给出参考的链接)
- 编译:将合法的
.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在操作系统层面为操作系统的堆区,因此可以实现捕获异常等优势 -
解释执行过程
解释执行包含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#什么是字节码-采用字节码的好处是什么
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步