更换执行引擎为spark 执行引擎 jvm_字节码

1、执行引擎概述

执行引擎是java虚拟机的核心组成部分之一

更换执行引擎为spark 执行引擎 jvm_java_02


jvm主要任务:

  • JVM主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所标志的字节指令、符号表、以及其他辅助信息。
  • 如果想让java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/翻译为对应平台的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者

更换执行引擎为spark 执行引擎 jvm_字节码_03

  1. 执行引擎在执行过程需要执行什么样的字节码完全依赖于PC寄存器
  2. 每当执行完一项指令操作后,PC寄存器就会更新下一条需要被执行的指令
  3. 当然方法在执行过程中,执行引擎有可能会通过存储在局部变量表中的对象引用准确定位到存储在java堆区中的对象实例信息,以及通过对象头中的元数据指针定位到目标对象的类型信息。

2、java代码编译和执行过程

问题:什么是解释器(Interpreter),什么是JIT编译器?

  • 解释器:当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
  •  JIT(Just In Time Compiler)编译器:就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言。

问题:为什么说java虚拟机是半解释半编译型语言?

  • JDK1.0时代,将java语言定位为“解释执行”还是比较准确的。再后来,Java也发展出可以直接生成本地代码的编译器。
  •  现在JVM在执行Java代码的时候,通常都会将解释执行与编译执行二者结合起来进行。

3、机器码、指令、汇编语言

更换执行引擎为spark 执行引擎 jvm_java_04

机器码:

  • 各种用二进制编码方式表示的指令,叫做机器指令,最开始就采用机器语言编写程序。
  • 机器语言虽然能被计算机理解和接收,但对人不友好,不易于记忆、理解,容易出错。
  • 用机器语言编写的程序直接由cpu读取运行,因此执行速度最快。
  • 不同种类cpu所对应的机器指令也不同

指令:

  • 由于机器语言仅有0和1构成,可读性差,于是有了指令
  • 指令就是把特定的0和1简化成对应的指令(一般为英文缩写:如mov、inc等)

指令集:

  • 不同硬件平台各自支持的指令是有差别的。因此每个平台所支持的指令,称之为对应平台的指令集。
  • 如常见的:
  • x86指令集
  • ARM指令集

汇编语言:

  • 由于指令的可读性还是太差,于是有了汇编语言。
  • 在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。
  • 汇编语言还需翻译成机器指令码,才能被计算机理解运行。

字节码:

字节码是一种中间状态(中间码)的二进制代码(文件),他比机器码更抽象,需要直译器转译后才能成为机器码。

  • 字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。
  • 字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机将字节码转译为可以直接执行的指令

4、解释器

JVM设计者们的初衷仅仅只是单纯地为了满足java的跨平台特性,因此避免采用静态编译的方式直接生成本地机器指令,从而诞生了实现解释器在运行时采用逐行解释字节码执行程序的想法。

  • 解释器所承担的角色是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
  • 当一条字节码指令解释执行完后,接着再根据PC寄存器记录的下一条字节码指令执行解释操作。

5、JIT编译器

前端编译器:
将.java文件翻译成.class文件的过程。
后端编译器:
将字节码文件翻译成机器码的过程。
静态提前编译器:
直接将.java文件翻译成本地机器机器代码的过程。

Hotspot VM可以设置程序执行方式

  • -Xint:完全采用解释器模式执行程序;
  • -Xcomp:完全菜哦用即使编译器模式执行程序。如果即使编译出现问题,解释器会介入执行。
  • -Xmixed:采用解释器即使编译器的混合模式共同执行程序。

更换执行引擎为spark 执行引擎 jvm_更换执行引擎为spark_05