前言
ladies and gentleman , 你们好😊 ,我是羡羡 , 在前面我们介绍了运行时数据区中的各个组成部分 , 这节我们来看 jvm 的另一核心 --- 执行引擎
执行引擎
jvm的主要任务是负责装载字节码到其内部 , 字节码并不等价于机器码 , 并不能直接运行在操作系统之上 , 所以想要让一个java程序运行起来 , 执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以
这里需要区分
1.前端编译:从 Java 程序员-字节码文件的这个过程叫前端编译. ( .java - .class)
2.执行引擎这里有两种行为:一种是解释执行,一种是编译执行(这里的是后端编译
从上面图中我们可以看到执行引擎中是存在解释器和即时编译器的, 接着我们来论述
什么是解释器?什么是 JIT 编译器?
解释器:当 Java 虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
JIT(Just In Time Compiler)编译器:就是虚拟机将源代码一次性直接编译成和本地机器平台相关的机器语言,但并不是马上执行。
解释执行就是从上到下依次逐行解释执行 , 编译执行就是整体编译 ,整体执行(编译的效率相对是比解释执行要高的)
为什么java是半解释半编译型语言?
jvm的设计者们在早期为了满足java的跨平台性, 因此避免了静态编译的方式来生成机器码 ,所以早期都是使用解释器来解释执行的 ,但是执行效率低 , 引入了JIT 编译器后 ,提高了执行效率 ,它将字节码翻译成本地代码后,就可以做一个缓存操作,存储在方法区的 JIT 代码缓存中(执行效率更高了)
是否需要启动 JIT 编译器将字节码直接编译为对应平台的本地机器指令,则需要根据代码被调用执行的频率而定。JIT 编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,将其直接编译为对应平台的本地机器指令,以此提升 Java 程序的执行性能。
目前 HotSpot VM 所采用的热点探测方式是基于计数器的热点探测。
那么JIT 编译器执行效率高为什么还需要解释器?
因为当程序启动时 , 解释器可以马上发挥作用 ,响应速度快 ,不用编译立即执行 . 编译器编译成本地代码后, 执行效率高 . 这时采取解释器和编译器共同工作可以换取一个平衡点 , 因此这种方式更加灵活
结语
这节介绍了执行引擎的工作原理等 , 下节将对垃圾回收这一块内容做详细的介绍 , 感谢您的关注与阅读, 谢谢 😊!