Java 程序执行过程

Java 程序的执行过程


图 1:JVM Model 图 2:Java 运行流程

根据图 2,java的执行可以分为编译和运行两个阶段,分别对应着图2的左侧和右侧部分这部分我们将侧重运行阶段(更详细的过程参考图 1)的介绍。(这里不对具体的内容进行详细讲解,对于具体的内容,将给出参考的链接)

  1. 编译:将合法.java文件翻译成字节码(bytecode)文件.class。其中包含着检查、分析(词法,语法,语义),优化等流程。
    https://www.cnblogs.com/code-duck/p/13568092.html
  2. 运行:运行阶段的整个流程可以分为加载阶段(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:

  1. 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#什么是字节码-采用字节码的好处是什么

LLM Question

https://poe.com/chat

posted @ 2024-04-04 16:58  屿蓝深海  阅读(9)  评论(0编辑  收藏  举报