解释器工作机制

  • 解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
  • 当一条字节码指令被解释执行完成后,接着再根据PC寄存器中记录的下一条需要被执行的字节码指令执行解释操作。

解释器分类

在Java的发展历史里,一共有两套解释执行器,即古老的字节码解释器、现在普
遍使用的模板解释器。

  • 字节码解释器在执行时通过纯软件代码模拟字节码的执行,效率非常低下。
  • 而模板解释器将每一条字节码和一个模板函数相关联,模板函数中直接产生这
    条字节码执行时的机器码,从而很大程度上提高了解释器的性能。
    ➢在HotSpot VM中,解释器主要由Interpreter模块和Code模块构成。
    1) Interpreter模块: 实现了解释器的核心功能
    2) Code模块:用于管理HotSpot VM在运行时生成的本地机器指令

现状:

  • 由于解释器在设计和实现上非常简单,因此除了Java语言之外,还有许多高级语言同样也是基于解释器执行的,比如Python、Perl、Ruby等。
  • 但是在今天,基于解释器执行已经沦落为低效的代名词,并且时常被一些C/C+ +程序员所调侃。
  • 为了解决这个问题,JVM平台支持一种叫作即时编译的技术。即时编译的目的是避免函数被解释执行,而是将整个函数体编译成为机器码,每次函数执行时,只执行编译后的机器码即可,这种方式可以使执行效率大幅度提升。
  • 不过无论如何,基于解释器的执行模式仍然为中间语言的发展做出了不可
    磨灭的贡献。

JIT编译器

HotSpotVM是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构。在Java虚拟机运行时,解释器和即时编译器能够相互协作,各自取长补短,尽力去选择最合适的方式来权衡编译本地代码的时间和直接解释执行代码的时间。

问题:为什么还需要解释器?

HotSpot虚拟机的执行方式

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

热点代码及探测方式

  • 是否需要启动JIT编译器将字节码直接编译为对应平台的本地机器指令,则需要根据代码被调用执行的频率而定。关于那些需要被编译为本地代码的字节码,也被称之为“热点代码”,JIT编译器在运行时会针对那些频繁被调用的“热点代码”做出深度优化,将其直接编译为对应平台的本地机器指令,以此提升Java程序的执行性能。
  • 一个被多次调用的方法,或者是一个方法体内部循环次数较多的循环体都可以被称之为“热点代码”,因此都可以通过JIT编译器编译为本地机器指令。由于这种编译方式发生在方法的执行过程中,因此也被称之为栈上替换,或简称为OSR (On Stack Replacement)编译。
  • 一个方法究竞要被调用多少次,或者一个循环体究竞需要执行多少次循环才可以达到这个标准?必然需要一个明确的阈值,JIT编译器才会将这些“热点代码”编译为本地机器指令执行。这里主要依靠热点探测功能。
  • 目前Hotspot VM所采用的热点探测方式是基于计数器的热点探测。
  • 采用基于计数器的热点探测,HotSpot VM将会为每一个方法都建立2个不同类型的计数器,分别为方法调用计数器(Invocation Counter) 和回边计数器(Back
    Edge Counter) 。
    ➢方法调用计数器用于统计方法的调用次数
    ➢回边计数器则用于统计循环体执行的循环次数

方法调用计数器:

  • 这个计数器用于统计方法被调用的次数,它的默认阈值在Client 模式下是1500次,在Server 模式下是10000 次。超过这个阈值,就会触发JIT编译。
  • 这个阈值可以通过虛拟机参数-Xx: CompileThreshold来人为设定。
  • 当一个方法被调用时,会先检查该方法是否存在被JIT编译过的版本,如果存在,则优先使用编译后的本地代码来执行。如果不存在已被编译过的版本,则将此方法的调用计数器值加1,然后判断方法调用计数器与回边计数器值之和是否超过方法调用计数器的阈值。如果已超过阈值,那么将会向即时编译器提交一个该方法的代码编译请求。

    回边计数器:
    它的作用是统计一个方法中循环体代码执行的次数,在字节码中遇到控制流向后跳转的指令称为“回边” (Back Edge) 。显然,建立回边计数器统计的目的就是为了触发OSR编译。

解释器与JIT编译器相关推荐

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

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

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

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

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

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

  4. java 解释器与JIT编译器

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

  5. 解释器和JIT编译器

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

  6. 执行引擎、解释器、编译器、JIT编译器的恩怨情仇

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

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

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

  8. 深入理解JVM虚拟机(九):运行期优化与JIT编译器

    1. JIT编译器的引入 首先我们这篇文章中所说的编译器都是指JVM的组成部分之一-即时编译器(JIT),与生成Java字节码的javac编译器要区分开来.首先我们这篇文章中所说的编译器都是指JVM的 ...

  9. 深入理解JVM之JIT编译器(二)

    上篇是分析了一下前段编译器,主要过程完成从java代码到字节码的转变,它的改进顶多是提高程序的编码速度和效率.本篇尝试探索JIT编译器,它能够完成从字节码到本地机器码的转变,从而真正的影响程序的运行效 ...

最新文章

  1. Flask的HelloWorld程序
  2. DeepFusion:基于单视图深度和梯度预测的单目SLAM实时稠密三维重建
  3. CALayer 知识:创建带阴影效果的圆角图片图层和创建自定义绘画内容图层
  4. 1494: 连续子串和续
  5. matlab图像的腐蚀和膨胀_OpenCV图像处理系列八 --- 腐蚀与膨胀
  6. 从傅里叶分析角度解读深度学习的泛化能力
  7. 2019牛客暑期多校训练营(第四场)I - String (后缀自动机+回文树)
  8. ORACLE搭建Stream过程中报错【error收集】
  9. linux中mysql导入数据库命令_linux下mysql数据库导入导出命令
  10. Linux下的分区工具
  11. 列表、元组、字典、集合的定义、操作与综合练习
  12. functions.php 在哪,functions.php常用函数
  13. combobox is not a function 问题解决
  14. 国外大神一张图学会python-学习Python不得不关注和学习的国外大神博客
  15. 20款最优秀的JavaScript编辑器
  16. 机器学习——数据的预处理(总结大全)
  17. JVM中的GC是什么
  18. 【AI参赛经验】汉字书法识别入门—by:真的学不会
  19. 限时5折,仅剩1天!这波羊毛我撸爆~
  20. 织梦DEDE搬家数据还原后 前台错位

热门文章

  1. 【redash】redash问题整理全(登录、查询)
  2. 数据库系统概论 ---- 第五章 -- 数据库完整性
  3. 从λ演算到函数式编程聊闭包(2):彻底理解JavaScript闭包规则
  4. 如何用Stata完成(shui)一篇经济学论文(十二):描述性统计、回归与结果保存
  5. 智能客服通信模块实现方式
  6. 程序员的一生,从那个高考的夏天开始......
  7. mysql学习笔记(i am小白)
  8. 二分答案 [Usaco2014 Mar]Sabotage
  9. 微信域名检测and防封高顶星技术
  10. 推荐一款仿Perfdog免费的Android/iOS性能测试工具-SoloX