JVM - 执行引擎

1.执行引擎概述:

1.执行引擎是 Java 虚拟机核心的组成部分之一。

2.JVM 的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只 是一些能够被 JVM 所识别的字节码指令、符号表,以及其他辅助信息。

3.那么,如果想要让一个 Java 程序运行起来,执行引擎(Execution Engine) 的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM 中的执行引擎充当了将高级语言翻译为机器语言的译者。

注意区分概念:

1.前端编译:从 Java 程序员-字节码文件的这个过程叫前端编译.

2.执行引擎这里有两种行为:一种是解释执行,一种是编译执行(这里的是后端 编译)

(
前端编译(.java --> .class):
字节码 不等于 机器码
需要JVM将字节码加载我们的内存中,再需要执行引擎将字节码解释/编译成机器码
后端编译(.class --> 机器码);
)

2.什么是解释器?什么是 JIT 编译器?

解释器:当 Java 虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。

JIT(Just In Time Compiler)编译器:就是虚拟机将源代码一次性直接编译 成和本地机器平台相关的机器语言,但并不是马上执行。

(执行引擎机制:
解释器:将字节码逐行解释执行.
JIT编译器(即时编译器):将字节码整体编译为机器码执行.
)

3 为什么 Java 是半编译半解释型语言?

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

原因:

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

解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行,执行效率低。

JIT 编译器将字节码翻译成本地代码后,就可以做一个缓存操作,存储在方法区 的 JIT 代码缓存中(执行效率更高了)。

是否需要启动 JIT 编译器将字节码直接编译为对应平台的本地机器指令,则需要根据代码被调用执行的频率而定。

JIT 编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,将其直接编译为对应平台的本地机器指令,以此提升 Java 程序的执行性能。

一个被多次调用的方法,或者是一-个方法体内部循环次数较多的循环体都可以被称之为“热点代码”。

目前 HotSpot VM 所采用的热点探测方式是基于计数器的热点探测。

(总结:
逐行解释执行效率低,
JVM会针对使用频率较高的热点代码进行编译并缓存起来,执行效率提高)

JIT 编译器执行效率高为什么还需要解释器?

1.当程序启动后,解释器可以马上发挥作用,响应速度快,省去编译的时间,立即执行。

2.编译器要想发挥作用,把代码编译成本地代码,需要一定的执行时间,但编译 为本地代码后,执行效率高。就需要采用解释器与即时编译器并存的架构来换取 一个平衡点。

(编译是需要消耗时间的,使用JVM刚刚启动后,可以先通过解释器 解释执行代码.之后再使用编译器编译执行,两者结合在一起.)

你可能感兴趣的:(笔记,Jvm,java,开发语言,后端,java虚拟机,jvm)