1.概述
1.执行引擎是Java虚拟机核心的组成部分之一。
2.JVM的主要任务时负责装载字节码到其内部,但字节码并不能够直接运行在操作系统上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表、以及其他辅助信息。
3.如果想要让一个Java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令。即:JVM中的执行引擎充当了将高级语言翻译成机器语言的译者。
注意区分概念:
1.前端编译:从Java程序员-字节码文件的这个过程称为前端编译;
2.执行引擎有两种行为:一种是解释执行,一种是编译执行(这里是后端编译)。
2.什么是解释器?什么是JIT编译器?
1.解释器:当java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
2.JIT(Just In Time Compiler)编译器:就是虚拟机将源代码一次性直接编译成和本地机器平台相关的机器语言,但并不是马上执行。
3.为什么Java是半编译半解释语言?
1.原因:JVM 设计者们的初衷仅仅只是单纯地为了满足 Java 程序实现跨平台特性,因此 避免采用静态编译的方式由高级语言直接生成本地机器指令,从而诞生了实现解 释器在运行时采用逐行解释字节码执行程序的想法。 解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的 内容“翻译”为对应平台的本地机器指令执行,执行效率低。 JIT 编译器将字节码翻译成本地代码后,就可以做一个缓存操作,存储在方法区 的 JIT 代码缓存中(执行效率更高了)。 是否需要启动 JIT 编译器将字节码直接编译为对应平台的本地机器指令,则需要 根据代码被调用执行的频率而定。 JIT 编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,将其 直接编译为对应平台的本地机器指令,以此提升 Java 程序的执行性能。 一个被多次调用的方法,或者是一-个方法体内部循环次数较多的循环体都可以 被称之为“热点代码。
2.JIT编译器执行效率高为什么还需要解释器?
- 当程序启动后,解释器可以马上发挥作用,响应速度快,省去编译的时间,立即执行。
- 编译器要想发挥作用,把代码编译成本地代码,需要一定的执行时间,但编译为本地代码后执行效率高。就需要采用解释器与JIT编译器并存的架构来换取一个平衡点。