学习宋红康老师的JVM课程已经有一段时间了,学习过程中发现,有些内容遗忘得很快,虽然自己也用印象笔记记录了,但是如果没有输出,知识仍然不能完全地消化。因此,决定在JVM专栏中记录和总结学过的内容,欢迎大家在评论区交流。

文章目录

  • 前言
  • 一、执行引擎
    • 1.1 JVM的组成部分
    • 1.2 执行引擎概述
    • 1.3 执行引擎的作用及工作过程
  • 二、机器码&指令&汇编&字节码
  • 三、Java代码编译和执行的过程
  • 四、解释器
    • 4.1 问题引出
    • 4.2 解释器的分类
    • 4.3 解释器的现状
  • 五、JIT编译器
  • 总结

前言

“说下Java代码编译和执行过程?”
“为什么需要执行引擎,它的工作过程是怎样的?”
“什么是解释器,什么是JIT编译器,它们有什么区别?”
“为什么有了JIT编译器还需要解释器?”
面试过程中,你是否被问到过这些问题,如果不能完全回答出来,那么这篇文章一定要看下去。


一、执行引擎

1.1 JVM的组成部分

执行引擎和JVM有什么关系呢?可以先来看下JVM的组成部分,以便了解执行引擎在JVM中的作用。
从上图可以看出,JVM包含两个子系统和两个组件
两个子系统:

  1. 类加载子系统:负责将字节码文件装载内存成为一个对象。
  2. 执行引擎:包含解释器、JIT编译器、垃圾收集器(GC)

两个组件:

  1. 运行时数据区
  2. 本地接口

1.2 执行引擎概述

执行引擎是JVM核心组成部分之一。这里的执行引擎特制虚拟机(VM)中的执行引擎,其实物理机中也存在执行引擎。物理机中执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机中的执行引擎是由软件自行实现的。因此,可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。那么,什么是不被硬件直接支持的指令集格式呢,别急,我们把这个问题放一放,后面自有解答。

1.3 执行引擎的作用及工作过程

为什么需要执行引擎呢?我们知道,jvm主要任务是装载字节码到其内部,但字节码不能直接运行在操作系统上,因为它内部仅仅包含一些能被jvm所识别的字节码指令、符号表以及其他辅助信息。所以,想让java程序执行起来,需要执行引擎将字节码指令解释/编译为对应平台上的本机机器指令
执行引擎的执行过程:

  • 如下图所示,执行引擎执行过程中执行什么指令依赖于程序计数器(PC寄存器)中的地址,它会根据该地址找到对应的指令。执行完成一条指令操作后,程序计数器会更新下一条需要被执行的指令地址。
  • 在方法执行过程中,执行引擎也可能根据虚拟机栈中局部变量表中存储的对象引用找到堆中对应的对象实例信息,还可能通过对象头中的元数据指针定位到目标对象的类型信息。

二、机器码&指令&汇编&字节码

了解代码编译和执行过程之前,先回顾下一些基础知识。

机器码:

* 各种用二进制编码方式表示的指令
* 任何用机器码编写的程序,cpu可以直接读取并运行,速度最快,不过可读性差

指令和指令集:

* 方便人们记忆,将机器码中的0、1序列简化表示为对应的指令。
* 由于硬件平台不同,执行同一个操作,对应的机器码可能不同,因此不同的硬件平台的同一个指令,对应 的机器码可能不同(如mov)
* 机器指令与CPU 紧密相关,不同的机器支持不同的指令。
* 每个平台所支持的指令称为指令集,如x86架构平台的机器支持x86指令集,ARM架构的机器支持ARM指令集

汇编:

* 由于指令的可读性还是太差,于是人们又发明了汇编语言。
* 在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。
* 在不同的硬件平台,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。
*  由于计算机只认识指令码,所以用汇编语言编写的程序还必须翻译成机器指令码,计算机才能识别和执行。


字节码:

* 一种中间状态的二进制代码(文件),它比机器码更加抽象,需要直译器转译后才能转为机器码。
* 主要是为了实现跨平台的特点,使得特定软件运行和软件环境、与硬件环境无关。
* 实现方式是通过编译器和虚拟机器。编译器将源码编译为字节码,特定平台上的虚拟机器将字节码转译为自己能识别并执行的指令。

三、Java代码编译和执行的过程

首先我们需要明确的是,大部分程序代码在转换为物理机器能理解的指令集之前,会经过以下步骤:

其中,橙色部分由javac编译器完成,生成线性的字节码指令。通过 javac 编译器,我们可以很方便地将 java 源文件编译成字节码文件。相对于JIT编译器,因为其处于编译的前期,因此又被称为前端编译器。
这个过程和JVM无关,因为对于 Java 虚拟机来说,其实际输入的是字节码文件,而不是 Java 文件。
javac编译过程如下所示:
执行步骤中的绿色部分由解释器完成,这也说明了java语言的半解释性。
蓝色对应的是如下的编译过程:

综上,当JVM启动时会根据预定义的规范对字节码进行逐行解释的方式执行,将字节码文件中的内容“翻译”为操作系统能理解的指令。

那么问题来了,为什么说Java是半解释型半编译型语言呢?
实际上,在jdk1.0时,java是解释执行的,后来做了优化。执行引擎在执行字节码指令时既可以选择解释器也可以选择编译器。这样JVM在执行java代码时,可以将解释执行和编译执行结合起来进行。

四、解释器

4.1 问题引出

为什么需要字节码作为中介,不直接将源代码编译为机器能识别的机器指令呢?

这是因为Java设计者的初衷是为了实现跨平台,因此避免采用类似C、C++那种静态编译的方式直接生成机器指令,从而诞生了通过编译器在运行时逐行解释字节码指令从而执行程序的想法。所以,解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行。

4.2 解释器的分类

字节码解释器

* 需要在执行代码时通过纯软件代码模拟字节码的执行,效率十分低

模板解释器

* 将每一条字节码和一个模板函数相关联,模板函数中直接产生这条字节码执行时的机器码,能提高性能
* Hotspot中,解释器主要有Interpreter模块和Code模块组成。* Interpreter模块:实现了解释器的核心功能* Code模块:用于管理Hotspot在运行时生成的本地机器指令

4.3 解释器的现状

虽然解释器在设计和实现上很简单,但基于它执行已经沦为低效的代名词。针对该问题,jvm平台支持一种称为及时编译的技术。它的目的是避免函数被解释执行,而是将整个函数体编译为机器码,每次函数执行时,只执行编译后的机器码,实现提高程序的执行效率。

五、JIT编译器

JIT编译器,英文为Just In Time Compiler。根据它,JVM可将源代码直接编译为和本地机器平台相关的机器语言指令。既然根据及时编译的技术,可以提高程序的执行效率,那么为什么不把解释器抛弃掉呢?为什么要将JIT编译器和解释器并存呢

JVM执行代码主要有两种方式:

  • 解释执行:一段代码,解释一行执行一行。即源程序被编译为字节码文件后,解释器逐行将字节码解释成机器指令并执行。
  • 编译执行:事先已经被编译成机器码,直接执行,不用解释。源程序被编译为字节码文件后,JIT编译器将字节码编译为机器指令,再由cpu执行


虽然JIT编译器能提高执行效率,但是在执行机器指令前,它需要对字节码进行编译,因此造成响应时间较长,而解释器可以直接对字节码进行解释执行。因此,Hotspot虚拟机采用二者并存的方式,在jvm执行过程中,二者相互协作,各自取长补短,尽全力去权衡编译本地代码的时间和直接解释执行代码的时间,保证执行效率。

在jvm启动时,解释器可以先发挥作用,而不必等待JIT编译器全部编译完成后再去执行,省去不必要的编译的时间。而随着程序运行时间的推移,即时编译器逐渐发挥作用,根据热点探测功能,将有价值的字节码编译为本地机器指令,以换取更高的执行效率

以下通过小例子查看JIT编译器的存在:

package jvm;
/*** 运行后,打开jconsole,查看JIT编译器*/import java.util.ArrayList;public class JITTest {public static void main(String[] args) {ArrayList list = new ArrayList();for (int i=0;i<100;i++){list.add("Hello!");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

运行以上程序过程中,打开jconsole工具,查看指定的Java进程:

在jconsole的VM概要一栏中,可以看到JIT编译器是确实存在的:


总结

关于执行引擎、解释器、编译器、JIT编译器,值得深入的点还有很多,比如热点探测、如何判断热点代码、热点检测方式,这篇文章只是做一个初步的介绍,待深入学习后,会及时更新相应的内容。欢迎关注我的JVM专栏— 轨迹_Mine的JVM专栏,后期会不断更新JVM的知识。


参考资料:

https://mp.weixin.qq.com/s/t-zf1O4LgustK_B–Lqnkg
尚硅谷宋红康JVM全套教程

执行引擎、解释器、编译器、JIT编译器的恩怨情仇相关推荐

  1. Java-虚拟机-执行引擎/解释器/编译

    JVM中有两种解释器 1.C++字节码解释器:使用C++代码模拟JVM指令,例如iload,istore等 2.模板解释器(JIT编译器):将程序中固定不变的指令,或者常用的代码段,翻译成机器代码,保 ...

  2. 执行引擎的工作过程、Java代码编译和执行的过程、解释器、JIT编译器

    执行引擎概述 执行引擎是Java虛拟机核心的组成部分之一. "虚拟机"是-一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接 ...

  3. 第 11 章 一 执行引擎概述、解释器、JIT编译器-热点代码优化

    第 11 章 执行引擎 Java到底是编译型语言还是解释型语言? 编译程序基本原理 首先Java通过源码编译器 Javac命令将源代码编译为字节码文件(.class文件), 字节码这种二进制流的文件不 ...

  4. java的编译器、解释器和JIT编译器(转载)

    这篇我们来聊聊java的编译器和解释器.先看看官方的解释: Java Compiler (Java 编译器) Java compiler reads source files written in t ...

  5. java 解释器与JIT编译器

    早在Java1.0版本的时候,Sun公司发布了一款名为Sun Classic VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,在当时这款虚拟机内部只提供解释器,用今天的眼光来看待必然是 ...

  6. 解释器与JIT编译器

    解释器工作机制 解释器真正意义上所承担的角色就是一个运行时"翻译者",将字节码文件中的内容"翻译"为对应平台的本地机器指令执行. 当一条字节码指令被解释执行完成 ...

  7. 解释器和JIT编译器

    解释器 1.初衷:单纯的实现Java程序的跨平台,避免采用静态编译将其转化为机器指令,运行时采用逐行解释字节码并执行程序. 2.工作机制 (1)担任翻译者,将字节码文件中的内容翻译为机器指令并执行 ( ...

  8. JVM00_面试官对类加载器子系统、运行时数据区、内存分布、执行引擎的灵虚拷问,你能坚持到第几问?

    因为热爱所以坚持,因为热爱所以等待.熬过漫长无戏可演的日子,终于换来了人生的春天.他逐渐被人熟知,被人喜爱 三年前,在苏州园区某个国企面试,第一道题目便是:JVM是什么吗?然后就是拿着笔试题目被面试官 ...

  9. jvm与jit编译器的区别_了解jvm和jit编译器的第1部分

    jvm与jit编译器的区别 Hello people!! 大家好!! I can see that the Java community is growing a lot but there are ...

最新文章

  1. Fabric动态增加组织【资料】
  2. 浏览器用xpath获取一直为空
  3. 2018阿里客户顾问
  4. Python架构(一)
  5. 剑指Offer - 面试题3. 数组中重复的数字(哈希)
  6. MySQL的多表查询(笛卡尔积原理)
  7. nginx documentation | Development guide
  8. POJ 2396 有上下界的可行流
  9. 如何用postman发送post请求
  10. python mysql到处excel
  11. 知乎cookies的介绍_Requestium = Requests + Selenium
  12. php 判断客户端类型,怎么使用php判断客户端的类型
  13. java冒泡排序代码详解
  14. 模拟电路实验 02 - | 阻容耦合放大电路
  15. 没有学历怎么找运维工作?
  16. Android wifi开发介绍
  17. python画柱形图显示数值_python画柱状图--不同颜色并显示数值的方法
  18. 什么耳机适合跑步、分享五款公认最好的跑步耳机
  19. CTFHub-网站源码-wp
  20. JAVA - base64图片加文字水印

热门文章

  1. Reason: Failed to determine a suitable driver class springboot配置了数据源,启动包url找不到 Reason: Failed to
  2. 小猫钓鱼——(c++用栈和队列实现)
  3. 心态很容易受别人影响_心理学:为什么你总被别人影响情绪,是因为你不懂“巴纳姆效应”...
  4. web项目访问路径上为什么不能写上WebContent
  5. 枢密院监督跟进乌隆他尼省和农布阿兰普省教育基金项目
  6. 首场“移动云杯”空宣会,期待与开发者一起共创算网新世界!
  7. 天呐!这款1.2GHz双核工业核心板,ARM+DSP+RISC-V,才99元起!
  8. python纳税_Python实现纳税,python,交税
  9. [转载]超强1000个jquery极品插件!(连载中。。。。)
  10. 【聚类算法】层次聚类算法