JIT

Java JIT(just in time)即时编译器是sun公司采用了hotspot虚拟机取代其开发的classic vm之后引入的一项技术,目的在于提高java程序的性能,改变人们“java比C/C++慢很多”这一尴尬印象。

说起来是编译器,但此编译器与通常说的javac那个编译器不同,它其实是将字节码编译为硬件可执行的机器码的。

图片来自于网络

如上图可以看出,整个java应用程序的执行过程如下:

1、源代码经javac编译成字节码,class文件

2、程序字节码经过JIT环境变量进行判断,是否属于“热点代码”(多次调用的方法,或循环等)

3、如是,走JIT编译为具体硬件处理器(如sparc、intel)机器码

4、如否,则直接由解释器解释执行

5、操作系统及类库调用

6、硬件

以上实际上是JVM的“混合模式”对java程序的执行方式。

 

jvm还有两种执行方式: 解释执行和编译执行

 
    对于解释执行,不经过jit直接由解释器解释执行所有字节码,执行效率不高。
而编译执行不加筛选的将全部代码进行编译机器码不论其执行频率是否有编译价值,在程序响应时间的限制下,编译器没法采用编译耗时较高的优化技术(因为JIT的编译是首次运行或启动的时候进行的!),所以,在纯编译执行模式下的java程序执行效率跟C/C++也是具有较大差距的。

因此,新版本的jvm默认都是采用混合执行模式。

 

     这里有个特别的例子,BEA公司为服务器硬件和服务端应用专门打造的高度优化的虚拟机————jrockit,由于面向服务端应用,所以它并不在意和关注程序的启动速度,jrockit并不实现解释器,而是将所有代码都交由jit做即时编译执行。

 

     jit并不一定总能提高程序的执行效率甚至适得其反,这很大一部分取决于开发人员所写的程序质量,作为优秀的工程师应该会写出对jit友好的程序。

原文链接:[http://wely.iteye.com/blog/2332461]

时间: 2024-08-29 02:05:31

JIT的相关文章

JIT编译

编译 在MSIL执行前,必须通过.NET框架的JIT编译器编译成本地代码,这个本地代码是基于特定CPU的,而且必须和JIT运行在同一套计算机体系结构上.由于运行时对于其运行的每一个CPU架构都提供了一个JIT编译器,开发人员可以编写一套可以通过JIT编译从而运行在不同架构的计算机上的MSIL代码(如果你的受控代码调用了特定平台的API或者类库,那么你的代码就只能在特定的计算机上执行了).    JIT编译的一个想法是基于认识到一些代码可能在执行过程中从来都没有被调用过这样一个事实,因而与其花费时

用WinDbg探索CLR世界 [3] 跟踪方法的 JIT 过程

过程 本来想按照 sos 的帮助文件上命令的分类逐步介绍 WinDbg 下使用 sos 调试 CLR 程序,但发现这样实在不够直观.索性改成根据我分析 CLR 的实际案例,step by step 介绍功能,这样结构上虽然混乱一点,但更加直观,也易于上手 :P 前面两篇文章里面分别介绍了 WinDbg 的调试配置和线程的基本概念,这篇文章将针对 JIT 编译对象方法的流程进行分析,逐步介绍如何使用 WinDbg 调试 CLR 程序. 用WinDbg探索CLR世界 [1] - 安装与环境配置用Wi

深入理解.NET 的JIT编译方式

编译 CLR只执行本机的机器代码.有两种方式产生本机的机器代码:实时编译(JIT)和预编译方式(产生native image).下面,我想谈谈JIT.CLR使用类型的方法表来路由所有的方法调用.类型的方法表由多个入口项组成.每个入口项指向一个唯一的存根例程(stub routine).初始化时,每个存根例程包含一个对于CLR的JIT编译器的调用(它由内部的PreStubWorker程序公开).在JIT编译器生成本机代码后,它会重写存根例程,插入一个jmp指令跳转到刚才JIT编译器的代码.只有当要

你可能错过的东西:.NET 3.5 SP1中的JIT增强

一个主要的影响就是内联函数(Inlining Function)调用.之前,JIT对内联方法的处理非常保守,Vance Morrison解释了个中缘由, 它对内联的处理并不是很好.内联总是减少指令执行的数量(这是由于最低限度的调用和返回指令没有被执行),但是它能(并经常)让结果代码变得很大.大部分人都能直觉地理解,内联大的方法(比如1Kb的)不是很有意义,而内联非常小的方法可以让调用的占用空间更小(由于调用指令才5字节),这样的选择总是正确的,但是介于两者之间的方法要如何处理呢? 有趣的是,当你

.Net Discovery系列之六 Me JIT(下)

接上文 在初始化时,HashTable中各个方法指向的并不是对应的内存入口地址,而是一个JIT预编译代理,这个函数负责将方法编译为本地代码.注意,这里JIT还没有进行编译,只是建立了方法表! 下表(表1)为首次加载调用时HashTable的情况: 表1 方法表示意 方法槽 方法描述 a1() PreJitStub a2() PreJitStub a3() PreJitStub 好了有了这个HashTable后,JIT开始编译第一个被调用的方法A.a1("First"),这是由一个JIT

.Net Discovery系列之五 Me JIT(上)

JIT(Just In Time简称JIT)是.Net边运行边编译的一种机制,这种机制的命名来源于丰田汽车在20世纪60年代实行的一种生产方式,中文译为"准时制". .Net 的JIT编译器在设计初衷和运行方式来上讲,都与丰田汽车的这种"准时生产"思想体系有着很大的相似之处,所以让我们先来透过"准时生产"方式来理解.Net的JIT机制吧. "准时生产"的基本思想可概括为"在需要的时候,按需要的量生产所需的产品&quo

【整理】Python之JIT、Django、Greenlet和Stackless

[JIT] 即时编译(Just-in-time compilation),又称为动态编译,是一种提高程序运行效率的方法.通常程序有两种编译方式:静态编译与动态编译(直译).在静态编译中,程序在执行前全部被翻译为机器码,而动态直译则是边运行边翻译.即时编译器则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗.相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性.即时编译器有两种类型,一是字节码翻译,二是动态编译翻译. 另外,一般来讲编译执行比解释执行要快,但是

Android 代码JIT友好度检测工具_Android

利用周末的时间,写了一个检测Android代码JIT友好度的工具,取个名字为DroidJitChecker.希望可以帮助大家快速发现有坏味道的代码,并且及时修正. 名词解释 JIT:JIT全称Just-in-time compilation.意思为实时编译,是JVM中一种优化技术,对频繁调用并且符合条件的方法进行优化将字节码翻译成机器代码,提升执行效率. 方法大小:每个方法的方法体实现都可用字节作为单位进行衡量,通常情况下,方法体越大,其方法大小也越大. JIT友好:通常方法体实现越小越简单,越

VMI和JIT

1.JIT生产方式的含义 JIT生产方式的基本思想可用现在已经广为流传的一句话来概括,即"只在需要时,按需要的量,生产所需的产品",这也就是just in time一词所要表达的本来含义.这种生 产方式的核心是追求一种零库存.零浪费.零不良.零故障.零灾害.零停滞的较为完美的生产系统,并为此开发了包括看板在内的一系列具体方法,逐渐形成了一套独具特色的 生产经营体系. VMI是Vendor Managed Inventory的缩写,直译就是"供应商管理库存",意译可为

Off-heap Memory in Apache Flink and the curious JIT compiler

Running data-intensive code in the JVM and making it well-behaved is tricky. Systems that put billions of data objects naively onto the JVM heap face unpredictable OutOfMemoryErrors and Garbage Collection stalls. Of course, you still want to to keep