早在Java1.0版本的时候,Sun公司发布了一款名为Sun Classic VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,在当时这款虚拟机内部只提供解释器,用今天的眼光来看待必然是效率低下的,因为如果Java虚拟机只能够在运行时对代码采用逐行解释执行,程序的运行性能可想而知。但是如今的HotSpot VM中不仅内置有解释器,还内置有先进的JIT(Just In Time Compiler)编译器,在Java虚拟机运行时,解释器和即时编译器能够相互协作,各自取长补短。在此大家需要注意,无论是采用解释器进行解释执行,还是采用即时编译器进行编译执行,最终字节码都需要被转换为对应平台的本地机器指令。或许有些开发人员会感觉到诧异,既然HotSpot VM中已经内置JIT编译器了,那么为什么还需要再使用解释器来“拖累”程序的执行性能呢?比如JRockit VM内部就不包含解释器,字节码全部都依靠即时编译器编译后执行,尽管程序的执行性能会非常高效,但程序在启动时必然需要花费更长的时间来进行编译。对于服务端应用来说,启动时间并非是关注重点,但对于那些看中启动时间的应用场景而言,或许就需要采用解释器与即时编译器并存的架构来换取一个平衡点。

既然HotSpot VM中采用了即时编译器,那么这就意味着将字节码编译为本地机器指令是一件运行时任务。在HotSpot VM中内嵌有两个JIT编译器,分别为Client Compiler和Server Compiler,但大多数情况下我们简称为C1编译器和C2编译器。开发人员可以通过如下命令显式指定Java虚拟机在运行时到底使用哪一种即时编译器,如下所示:

-client:指定Java虚拟机运行在Client模式下,并使用C1编译器;

-server:指定Java虚拟机运行在Server模式下,并使用C2编译器。

除了可以显式指定Java虚拟机在运行时到底使用哪一种即时编译器外,默认情况下HotSpot VM则会根据操作系统版本与物理机器的硬件性能自动选择运行在哪一种模式下,以及采用哪一种即时编译器。简单来说,C1编译器会对字节码进行简单和可靠的优化,以达到更快的编译速度;而C2编译器会启动一些编译耗时更长的优化,以获取更好的编译质量。不过在Java7版本之后,一旦开发人员在程序中显式指定命令“-server”时,缺省将会开启分层编译(Tiered Compilation)策略,由C1编译器和C2编译器相互协作共同来执行编译任务。不过在早期版本中,开发人员则只能够通过命令“-XX:+TieredCompilation”手动开启分层编译策略。

之前笔者曾经提及过,缺省情况下HotSpot VM是采用解释器与即时编译器并存的架构,当然开发人员可以根据具体的应用场景,通过命令显式地为Java虚拟机指定在运行时到底是完全采用解释器执行,还是完全采用即时编译器执行。如下所示:

-Xint:完全采用解释器模式执行程序;

-Xcomp:完全采用即时编译器模式执行程序;

-Xmixed:采用解释器+即时编译器的混合模式共同执行程序。

在此大家需要注意,如果Java虚拟机在运行时完全采用解释器执行,那么即时编译器将会停止所有的工作,字节码将完全依靠解释器逐行解释执行。反之如果Java虚拟机在运行时完全采用即时编译器执行,但解释器仍然会在即时编译器无法进行的特殊情况下介入执行,以确保程序能够最终顺利执行。

由于即时编译器将本地机器指令的编译推迟到了运行时,自此Java程序的运行性能已经达到了可以和C/C++程序一较高下的地步。这主要是因为JIT编译器可以针对那些频繁被调用的“热点代码”做出深度优化,而静态编译器的代码优化则无法完全推断出运行时热点,因此通过JIT编译器编译的本地机器指令比直接生成的本地机器指令拥有更高的执行效率也就理所当然了。比如使用Python实现的PyPy执行器,比使用C实现的CPython解释器更加灵活,更重要的是,在程序的运行性能上进行比较,PyPy将近是CPython解释器执行效率的1至5倍,这就是对JIT技术魅力的一个有力证明。并且Java技术自身的诸多优势同样也是C/C++无法比拟的,所谓各有所长就是这个道理。在此大家需要注意,世界上永远没有最好的编程语言,只有最适用于具体应用场景的编程语言。

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

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

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

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

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

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

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

  4. 解释器与JIT编译器

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

  5. 解释器和JIT编译器

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

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

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

  7. jit java 怎么配置_新的Java JIT编译器Graal简介

    在本教程中,我们将深入研究名为Graal的新Java实时(JIT)编译器. 让我们首先解释JIT编译器的作用. 当我们编译Java程序时(例如,使用  javac命令),我们最终将源代码编译成代码的二 ...

  8. 解密新一代Java JIT编译器Graal

    \ 关键要点 \\ Java的C2 JIT编译器寿终正寝.\\t 新的JVMCI编译器接口支持可插拔编译器.\\t 甲骨文开发了Graal,一个用Java编写的JIT,作为潜在的编译器替代方案.\\t ...

  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. 【每日一题】二分查找
  2. MATLAB中cif用于清除什么,cifti-matlab-master 能够对MRI数据进行功能成像 - 下载 - 搜珍网...
  3. 剑指offer の 1-10 之javascript实现
  4. Java基础(三十二)JDBC(2)连接数据库
  5. jQuery实现复选框的全选和反选:
  6. 1499元被标149元,苹果官网产品出现Bug价后续:白高兴了!
  7. 2019.03.17 14:58
  8. redis主线程阻塞的情形
  9. vue-cli的项目中关于axios的全局配置,结合element UI,配置全局loading,header中做token传输...
  10. 第四篇:在MVPArms中报错error: cannot find symbol class DaggerXXXComponent的问题
  11. SubSonic的配置及运用
  12. 《Unity shader入门精要》阅读笔记
  13. 计算机ps基础考试题,2014计算机一级考试PS及基础模拟试题
  14. 阿里云域名搭建DNSLOG
  15. MATLAB黄金分割法标注最优点,matlab黄金分割法课程论文--.doc
  16. 【随笔】Linux刷脏页
  17. 啥是认知智能? 认知智能和人工智能到底有啥区别? 你知道吗? 道翰天琼认知智能。
  18. vi ~/.bashrc如何保存退出
  19. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合
  20. 单词读音下载-python(英式美式)

热门文章

  1. java 解析 ical_使用Java编写.ics iCal文件
  2. android 上下平滑翻页
  3. Vue调用微信JSSDK上传图片(wx.uploadImage)
  4. 我是怎么绕过微信小程序审核机制的
  5. 【PyTorch基础教程30】DSSM双塔模型(线上召回 | 模型更新)
  6. 东进语音卡 java_东进语音卡的声音文件格式
  7. 简易Lasso回归 R语言 变量含有分类变量处理
  8. LightningChart-3D图表特性
  9. Elasticsearch 权威教程 - 入门
  10. C# 海康摄像头视频播放的两种方式