java--代码编译和执行的整个过程

author author     2022-09-22     576

关键词:

1. 什么是 JVM

  JVM 是 Java 的核心和基础,在 Java 编译器和 os 平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行 Java 的字节码程序。Java 编译器只需面向 JVM,生成 JVM 能理解的代码或字节码文件。Java 源文件经编译器,编译成字节码程序,通过 JVM 将每一条指令翻译成不同平台机器码,通过特定平台运行。

简单的说,JVM 就相当于一台柴油机,它只能用 Java (柴油)运行,JVM 就是 Java 的虚拟机,有了 JVM 才能运行 Java 程序

    技术分享

 

2. Java 代码编译是由 Java 源码编译器来完成,流程图如下所示:

      技术分享

Java 字节码的执行是由 JVM 执行引擎来完成,流程图如下所示:

      技术分享

Java 代码编译和执行的整个过程包含了以下三个重要的机制:

  • Java 源码编译机制
  • 类加载机制
  • 类执行机制

 

3.Java 源码编译机制

Java 源码编译由以下三个过程组成:

  • 分析和输入到符号表
  • 注解处理
  • 语义分析和生成 class 文件

流程图如下所示:

技术分享

最后生成的 class 文件由以下部分组成:

  • 结构信息。包括 class 文件格式版本号及各部分的数量与大小的信息。
  • 元数据。对应于 Java 源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池。
  • 方法信息。对应 Java 源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息。

 

4. 类加载机制

 JVM 的类加载是通过 ClassLoader 及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

      技术分享

  

1)Bootstrap ClassLoader

  负责加载$JAVA_HOME中jre/lib/rt.jar里所有的 class,由 C++ 实现,不是 ClassLoader 子类。

2)Extension ClassLoader

  负责加载Java平台中扩展功能的一些 jar 包,包括$JAVA_HOME中jre/lib/*.jar-Djava.ext.dirs指定目录下的 jar 包。

3)App ClassLoader

  负责记载 classpath 中指定的 jar 包及目录中 class。

4)Custom ClassLoader

  属于应用程序根据自身需要自定义的 ClassLoader,如 Tomcat、jboss 都会根据 J2EE 规范自行实现 ClassLoader。

加载过程中会先检查类是否被已加载,检查顺序是自底向上,从 Custom ClassLoader 到 BootStrap ClassLoader 逐层检查,只要某个 Classloader 已加载就视为已加载此类,保证此类只所有 ClassLoade r加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

 

5. 类执行机制

  JVM 是基于栈的体系结构来执行 class 字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。栈的结构如下图所示:

技术分享

java代码编译和执行的整个过程

Java代码编译是由Java源码编译器来完成,流程图如下所示:Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:Java代码编译和执行的整个过程包含了以下三个重要的机制:Java源码编译机制类加载机制类执行机制Java源码编... 查看详情

java代码编译和执行的整个过程

Java代码的编译和执行的整个过程大概是:开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转... 查看详情

java代码编译和执行的整个过程(代码片段)

...码的执行是由JVM执行引擎来完成,流程图如下所示:Java代码编译和执行的整个过程包含了以下三个重要的机制:Java源码编译机制类加载机制类执行机制Java源码编译机制Java源码编译由以下三个过程组成:分析和输入到符号表注... 查看详情

java--代码编译和执行的整个过程

...va的字节码程序。Java编译器只需面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译器,编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。简单的说,JVM就相当于一台 查看详情

java代码编译和执行的整个过程(代码片段)

1、JDK/JRE/JVM之间的关系JVM:JavaVirtualMachine(Java虚拟机),包含了Java最核心的类库。JRE:javaruntimeenvironment(java运行环境),包含了JVM和一些常见的Java运行类库,即JRE=JVM 查看详情

java编译程序和运行过程详解

...理简单过程:词法分析-->语法分析-->语义分析和中间代码生成-->优化-->目标代码生成Java程序从源文件创建到程序运行要经过两大步骤:1、Java文件会由编译器编译成class文件(字节码文件),会经过编译原理简单过程的... 查看详情

java代码编译和执行的过程!我们用思维导图的方式来进行沟通。

...场、产品、研发、管理等相关经验。今天的主题是:Java代码编译和执行的过程!我们用思维导图的方式来进行沟通。Java源代码编译Java类加载&执行class字节码Java类执行完整的思维导图如果需要本文完整高清图片、思维导图文... 查看详情

简述java程序的编辑编译和运行过程

...,本文通过一个简单的程序来简单的说明整个流程。Java代码编译:是由Java源码编译器来完成;Java字节码的执行:是由JVM执行引擎来完成Java程序从源文件创建到程序运行要经过两大步骤:1、源文件由编译器编译成字节码(ByteCode)2... 查看详情

java执行过程

...口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode),它不面向任何特定的处理器,只面向虚拟机。... 查看详情

jvm执行引擎篇(解释器与编译器)(代码片段)

...详解5.执行方式设置1.编译和执行的过程大部分的程序源代码转换成物理机的目标代码或虚拟机能执行的指令集之前,都需要经历如下步骤代码编译由Java源码编译器javac完成代码执行由Java虚拟机执行引擎完成2.编译器和解释器... 查看详情

一段程序从编译到硬件再到执行的过程(代码片段)

...语言或机器语言)  预处理:    预编译过程对源代码做了如下的操作:    删除所有的注释信息    删除所有的#define并展开所有宏定义    插入所有#include文件注1的内容到源文件中的对应位置,inclu 查看详情

buildtool(构建工具)

什么是buildtool?构建工具是从源代码自动创建可执行应用程序的程序。构建包括将代码编译,链接和打包成可用或可执行的形式。在小项目中,开发人员通常会手动调用构建过程。这对于较大的项目来说是不实际的,在这些项目... 查看详情

intellijidea怎么写java程序

...序的输出显示在屏幕下方参考技术A如图所示:1.2.3.1、Java代码编译是由Java源码编译器来完成,流程图如下所示: Java代码编译2、Java字节码(class文件)的执行是由JVM执行引擎来完成,流程图如下所示:  Java字节码的... 查看详情

简述java程序从编写到运行的基本步骤,并说明java的基本工作原理

...a的基本工作原理Java编译原理:Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。  一.Java源文件的编译、下载、解释和... 查看详情

c/c++程序编译过程详解

C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系... 查看详情

c/c++程序编译过程详解

C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系... 查看详情

关于整个编译过程和库文件的问题

论述1在C中编译器单独编译(Compile)每个源文件(.c)生成相应的目标文件(.obj)链接器链接(Link)各个目标文件(.obj)和资源文件(.res)生成可执行文件(.exe)其中,obj是Complie的产物,同时也是Link的对象,而exe是Link的产物问题1(可多选)静... 查看详情

javascript的预编译和执行

 JavaScript引擎,不是逐条解释执行javascript代码,而是按照代码块一段段解释执行。所谓代码块就是使用<script>标签分隔的代码段。整个代码块共有两个阶段,预编译阶段和执行阶段一、编译阶段对于常见编译型语言(例... 查看详情