JIT,就是JUST IN TIME的缩写,在计算机技术体系内,JIT指一种动态编译(Dynamic Compilation)技术。

先解释几个概念:

解释(Interpreter):解释就是把源程序以句为单位,每句每句的解释并执行;如果语句出现在循环体当中,比如循环10次,该语句就要被解释执行10次;解释执行过程不产生目标代码。很多脚本语言都是解释执行的。

编译(Compilation):编译是把源代码一次性翻译成目标代码,目标代码可能是可直接运行的机器语言,或是已存在相应翻译器的不可执行语言。比如C/C++就是典型的编译之后才能执行的高级编程语言,这种编译也被称为静态编译(Static Compilation)。编译有时还指将高级语言编译成一种中间形态的字节码,比如java语言,这种中间形态的字节码比如要在JVM里面才能被执行。

JIT的意思是说,首先仍然是compilation,但有caching,不用象解释那样把循环体里面出现的代码重复解释;同时有目标机器代码。这是相对于interpretation的好处。另外相对于静态编译的好处是,在编译过程对代码进行优化。选择性的编译某个函数或任意某段代码。JIT具体的做法是这样的:当函数第一被调用时,JIT将该函数编译成机器语言;当再次遇到该函数时则直接从cache中执行已编译好的机器语言。

Java的JIT工作原理:

JVM读入.class文件解释后,将其发给JIT编译器;JIT编译器将字节码编译成本机机器代码;

通常javac将程序源代码编译转换成java字节码,JVM通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。

很显然,解释执行速度必然会比可执行的二进制程序慢。

为了提高执行速度,引入了JIT技术,在运行时,JIT编译器将java字节码进行编译,并会把机器码保存起来,以备下次需要时使用,因此从理论上来说,采用该JIT技术可以接近以前纯编译技术。

静态编译 VS 动态编译

静态编译优化和动态编译优化最大的不同是他们在编译时所得到的信息量的不同。静态编译在运行程序之前就把所有的执行代码编译完,这时编译器所接受的编译信息量是不够多的。比如说:某个函数是否是大量地被调用了,函数的实参是不是一直是一个常数,等等。

动态编译之于静态编译,缺点是它需要即时编译代码,但是有一个优点----编译器可以获得静态编译期所没有的信息。比如:通过运行时的profiling可以知道哪些函数是被大量使用的。在哪些execution path上哪些函数的参数一直都没有变,等等。不要小看这些信息,当即时编译器了解这些信息之后可以在短时间内编译出比静态编译器更优质的二进制码。

举例来说,一般程序也遵循90-10原则,即运行时的90%里计算机是在处理其中10%的代码,寻找到这些执行热点代码进行深度优化能得到比静态编译更好的性能(因为已知更多信息量)。

java jit技术_如何理解JIT编译技术?相关推荐

  1. delete优化_深入理解JIT和编译优化

    点击上方的蓝字关注我吧 程序那些事 简介 小师妹已经学完JVM的简单部分了,接下来要进入的是JVM中比较晦涩难懂的概念,这些概念是那么的枯燥乏味,甚至还有点惹人讨厌,但是要想深入理解JVM,这些概念是 ...

  2. java 异常机制_深入理解Java异常处理机制

    一.引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中 ...

  3. 深入理解java虚拟机 新生代_深入理解java虚拟机:笔记

    1.运行时数据区域 1.程序计数器 当前线程执行字节码的行号指示器,字节码解释器工作通过改变这个计数器的值来选取下一条需要执行的字节码指令,每一个线程拥有独立的程序计数器,线程私有的内存 2.虚拟机栈 ...

  4. java虚拟机现状_深入理解java虚拟机的故障处理工具

    前言 本文主要给大家介绍的是java虚拟机的故障处理工具,文中提到这些工具包括: 名称 主要作用 jps JVM process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程 ...

  5. java 常量折叠_深入理解Java虚拟机之早期编译器优化

    Javac编译器 Javac编译器是一个由Java语言编写的程序 Javac的源码与调试 从Sun Javac的代码来看,编译器大致分为3个过程: 解析与填充符号表的过程 插入式注解处理器的注解处理过 ...

  6. linux查看java虚拟机内存_深入理解java虚拟机(linux与jvm内存关系)

    本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...

  7. as和java什么关系_深入理解happens-before和as-if-serial语义

    概述 本文大部分整理自<Java并发编程的艺术>,温故而知新,加深对基础的理解程度. 指令序列的重排序 我们在编写代码的时候,通常自上而下编写,那么希望执行的顺序,理论上也是逐步串行执行, ...

  8. java stringbuffer原理_深入理解Java:String

    在讲解String之前,我们先了解一下Java的内存结构. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两 ...

  9. sas java 虚拟机异常_深入理解JAVA虚拟机之异常诊断

    常见的JAVA虚拟机HotSpot虚拟机运行时数据库由5部分构成:方法区,堆,虚拟机栈,本地方法栈,程序计数器.下面列举各个部分可能出现的异常及其出现原因. 1.方法区存放的已被虚拟机加载的类型信息, ...

最新文章

  1. FFmpeg 中AVPacket的使用
  2. 微软一站式示例代码库 7月新代码示例发布
  3. C++ 方块游戏小更新
  4. 拒绝卡顿,揭秘盒马鲜生 Android 短视频秒播优化方案
  5. React Native中常用ES6语法
  6. Python爬虫学习系列教程-----------爬虫系列 你值的收藏
  7. C++学习札记(1)
  8. 5G O-RAN 一体式小基站硬件白盒化的参考架构
  9. 数据模型 同比 环比_同比和环比计算公式?
  10. vue-element-admin的二次开发
  11. 怎样在matlab中使用多项式,MATLAB中的多项式运算
  12. 垂直和水平滑动刻度尺
  13. 处女座和小姐姐(模拟)
  14. return function和return function()的区别
  15. Poser 11基本使用
  16. 前端基础知识学习 XML JSON RESTFUL SOAP WEBSERVICE
  17. 三国论(21-25章)
  18. 用C语言学生成绩数据库排序功能设计,[c语言学生成绩管理系统]C语言学生成绩管理系统实验报告...
  19. 计算机光盘模式,Win7系统自带光盘刻录功能如何使用?
  20. 将屏幕内容保存到文件中

热门文章

  1. 软件发明专利实例_软件发明专利思路(精)
  2. Android 删除图片后刷新媒体库
  3. oracle的空间字段、空间函数,空间数据类型
  4. 分布式系统的特点及问题
  5. windows 禁用中文输入法(转)
  6. Tomcat6中web项目部署路径webapps和wtpwebapps的区别
  7. 高通SDX12:USB2.0 端口枚举失败问题分析及解决方案
  8. Allegro自动备份PCB设计文件的方法
  9. [MacOS] 出现 Permission denied 解决办法
  10. photoshop进行景深合成