0、提问!
提问:为什么不直接把Java语言用JVM解释执行呢?还要加一个中间产物字节码文件呢?
原因:JVM如果直接执行Java语言花费的时间成本太高了。JVM专注于把字节码指令翻译成机器指令效率更高。
1、执行引擎概述
- "虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集。和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。
- JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息。
- 那么,如果想要让一一个Java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译(这个编译不是将Java代码翻译成字节码的翻译)为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
2、Java代码编译和执行过程
- 执行引擎的工作过程
3、机器码、指令、汇编语言
- 机器码就是对应的能够被CPU直接执行的二进制指令
- 把一些机器码进行封装就成了指令,但是还是不便于人们学习,没有人类类语言的特性;比如说:010100110翻译成指令就是mov。又比如说:www.baidu.com就是指令,而百度的ip地址就是相应的机器码
- 汇编语言,也是种低级语言,把指令进行进一步封装,执行速度很快。
- 高级语言:Java、C、C++、Python等
5. 字节码
4、解释器
什么是解释器(Interpreter)
解释器:当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行(效率低下,落后代名词),将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
5、JIT编译器
- 什么是JIT编译器?
JIT (Just In Time Compiler) 编译器:就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言。 - Hotpot虚拟机采用的是解释器与即时编译器并存的架构,它们能够相互协作,各自取长补短。
- 当虚拟机启动的时候,解释器可以首先发挥作用,而不必等待即时编译器全部编译完成再执行,这样可以省去许多不必要的编译时间。并且随着程序运行时间的推移,即时编译器逐渐发挥作用,根据热点探测功能,将有价值的字节码编译为本地机器指令,以换取更高的程序执行效率。
6、关于AOT(提前编译器)
AOT在JDK9时就处于试验阶段。
作用:在程序运行之前就把.class文件翻译成机器码
优点:程序运行直接执行机器码,执行速度飞快!
缺点:缺点:不能够遵循Java程序“一次编译,到处执行”;因为不同的CPU拥有不同的指令架构,需要执的话,生成机器码必须要被对应CPU识别才行。
6.结论
解释器:响应速度快,执行速度慢;
编译器:执行速度块,响应速度慢;