java之jit(justintime)

抒抒说      2022-04-06     217

关键词:

Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块运行的特别频繁时,会把这些代码认定为“热点代码”(Hot Spot Code)。为了提高热点代码的执行效率,在运行时,虚拟机会把这些代码编译成本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT编译器,不是Java虚拟机内必须的部分)。

要了解HotSpot虚拟机内的即时编译器的运作过程,要解决几个问题:

  • 为何HotSpot虚拟机要使用解释器和编译器并存的架构?
  • 为何HotSpot虚拟机要实现两个不同的即时编译器?
  • 程序何时使用解释器执行?何时使用编译器执行?
  • 哪些程序代码会被编译成本地代码?如何编译?
  • 如何从外部观察即时编译器的编译过程和编译结果?

0.1.解释器和编译器:

  解释器是一条一条的解释执行源语言。比如php,postscritp,javascript就是典型的解释性语言。(直接执行

  编译器是把源代码整个编译成目标代码,执行时不再需要编译器,直接在支持目标代码的平台上运行,这样执行效率比解释执行快很多。比如C语言代码被编译成二进制代码(exe程序),在windows平台上执行。

 

  当程序需要快速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,越来越多的代码被编译成本地代码,可以获取更好的执行效率。解释器比较节约内存,编译器的效率比较高。解释器还可以作为编译器激进优化操作的“逃生门”,当激进优化的假设不成立,就退回到解释状态继续执行。

 

0.2 为何HotSpot虚拟机要实现两个不同的即时编译器: 

  HotSpot内置了两个编译器,分别是Client Compiler和Server Complier,或者简称为C1和C2编译器。同时用到两个编译器的分层编译(Tiered Compilation)策略,使用后,C1和C2同时工作,有些代码可能多次编译,用C1获取更高的编译速度,C2获取更好的编译质量

  • 第0层,程序解释执行,解释器不开启性能监视功能(Profiling),可触发第1层编译。
  • 第1层,也称为C1编译,将字节码编译成本地代码,进行简单、可靠的优化,若有必要将加入性能监控的逻辑。
  • 第2层,也称为C2编译,也是将字节码编译成为本地代码,但是会启动一些编译耗时较长的优化,甚至会根据性能监控进行一些不可靠的激进优化。

 

0.3 

编译对象和触发条件

在运行过程中被即时编译器编译的“热点代码”有两类,即:

  • 被多次调用的方法
  • 被多次执行的循环体

对第一种情况,由于是方法调用触发的编译,因此编译器会以整个方法作为编译对象,即标准的JIT编译方式。后一种,虽然是循环体触发的编译动作,但编译器依然按照整个方法(而不是单独的循环体)作为编译对象。这种编译方式称为栈上替换(On Stack Replacement,简称为OSR编译)。

判断一段代码是不是热点代码,是不是需要触发即时编译,这样的行为称为热点探测(Hot Spot Detection),目前有两种方法:

  1. 基于采样的热点探测:采用这样的方法的虚拟机会周期性的检查各个线程的栈顶,如果发现某个(或某些)方法经常出现在栈顶,那这个方法就是“热点方法”。其好处就是实现简单、高效,还可以很容易的获取方法调用关系(将调用栈展开即可),缺点是很难精确的确认一个方法的热度,容易因为受到线程阻塞或别的外界因素的影响。
  2. 基于计数器的热点探测:为每一个方法(甚至是代码块)建立计数器,统计方法的执行次数,超过一定的阈值就认为是“热点方法”。缺点是实现起来更麻烦,需要为每个方法建立并维护计数器,并且不能直接获取到方法的调用关系,优点是它的统计结果相对来说更加精确和严谨。

HotSpot虚拟机使用第二种,它为每个方法准备了两类计数器:方法调用计数器(Invocation Counter)和回边计数器(Back Edge Counter,用于统计一个方法中循环体代码执行的次数)。 

 

 

 

本文来自:https://blog.csdn.net/shengzhu1/article/details/73281722

 

jit即时编译

WeiboGoogle+用电子邮件发送本页面JIT是justintime的缩写,也就是即时编译编译器。使用即时编译器技术,能够加速Java程序的执行速度。下面,就对该编译器技术做个简单的讲解。首先,我们大家都知道,通常通过jav... 查看详情

什么是jit编译器?

...解释说法2:一边解释一边编译什么是JIT编译器(Justintim 查看详情

浅谈对jit编译器的理解。

1.什么是JustInTime编译器?HotSpot编译当JVM执行代码时,它并不立即开始编译代码。这主要有两个原因:首先,如果这段代码本身在将来只会被执行一次,那么从本质上看,编译就是在浪费精力。因为将代码翻译成java字节码相对于编... 查看详情

浅谈mes系统smt的jit功能:jit原理

...需要用到JIT等等一些经验首先说说JIT:准时制生产方式(JustInTime简称JIT)指的是:将必要的零件以必要的数量在必要的时间送到生产线,并且只将所需要的零件、只以所需要的数量、只在正好需要的时间送到生产JIT生产方式的... 查看详情

jit是什么,它将怎样运行?(代码片段)

什么是JIT?名如其特点,JIT——justintime,即时编译。把它详细化点讲,就是一个程序在它运行的时候创建并且运行了全新的代码,而并非那些最初作为这个程序的一部分保存在硬盘上的固有的代码。就叫JIT。这里有几点要看的... 查看详情

小师妹学jvm之:jit中的printassembly(代码片段)

...想不想了解JVM最最底层的运行机制?想不想从本质上理解java代码的执行过程?想不想对你的代码进行进一步的优化和性能提升?如果你的回答是yes。那么这篇文章非常适合你,因为本文将会站在离机器码最近的地方来观看JVM的... 查看详情

dart的特性(jit与aot、内存分配与垃圾回收、单线程模型)

...术A借助于先进的工具链和编译器,Dart是少数同时支持JIT(JustInTime,即时编译)和AOT(AheadofTime,运行前编译)的语言之一。JIT和AOT是最常见的两种编译模式。Dart是单线程模型,Dart中并没有多线程概念,只有Isolate(隔离区)。Isolates之... 查看详情

小师妹学jvm之:jit中的printcompilation(代码片段)

目录简介PrintCompilation分析PrintCompilation的结果总结简介上篇文章我们讲到了JIT中的LogCompilation,将编译的日志都收集起来,存到日志文件里面,并且详细的解释了LogCompilation日志文件中的内容定义。今天我们再和小师妹一起学习Log... 查看详情

pre-compile(pre-jit)yourassemblyonthefly,ortriggerjitcompilationahead-of-time(转)

IntroductionAll.NETdevelopersknowthatoneofthebestfeaturesoftheCLRisJIT-compilation:Just-In-Timecompilation.Itsnamedescribeshowitworks:rightbeforecallingyourmethod(justintime),theCLRtriggerstheJIT-comp 查看详情

jvm系列之:jit中的virtualcall接口(代码片段)

目录简介最常用的接口List多个List的调用不一样的List调用总结简介上一篇文章我们讲解了VirtualCall的定义并举例分析了VirtualCall在父类和子类中的优化。JIT对类可以进行优化,那么对于interface可不可以做同样的优化么?一起来看... 查看详情

深入理解dalvik虚拟机-解释器的执行机制

...可想而知。解释器的效率是相对较低的,所以出现了JIT(JustInTime),JIT是将运行次数较多的函数,做即时编译,在运行时刻,编译成本地目标代码。JIT能够看成是解释器的一个补充优化。再之后又出现了Art虚拟机的AOT(Ahe 查看详情

你应该知道的关于hotspotvm的内容

...C++实现,JNI接口部分用C实现.HotSpot是较新的JVM,用来替代JIT(JustinTime,即时编译),可以大大提高Java的运行性能,即:Java起初是把 查看详情

juc并发编程--jit即时编译器之锁清除(代码片段)

1.1锁消除导入相关依赖:因为JMH是JDK9自带的,如果是JDK9之前的版本需要加入如下依赖<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.23</version>&l 查看详情

如何使 numba @jit 使用所有 cpu 内核(并行化 numba @jit)

...加两个numpy数组。如果我使用@jit与python相比,性能是如此之高。但是,即使我传入@numba.jit(nopytho 查看详情

Java JIT循环展开策略?

】JavaJIT循环展开策略?【英文标题】:JavaJITloopunrollingpolicy?【发布时间】:2011-11-0618:40:35【问题描述】:JIT的循环展开策略是什么?或者,如果没有简单的答案,那么有什么方法可以检查循环展开的位置/时间?GNodechild=null;for(in... 查看详情

并发编程之java内存模型

1、基本概念程序:代码,完成某一任务,代码序列(静态的概念)进程:程序在某些数据上的一次运行(动态概念)线程:一个进程可能包含一个或多个线程(占有资源的独立单元)2、JVM与线程JVM虚拟机在类被调用的时候启动先... 查看详情

采购中的术语是啥意思,如:pr,po,rfq,rfi,sow,bom,jit,vmi,mro

...的产品或服务的叙述性的描述BOM(BillOfMaterial)物料清单JIT(JustInTime)准时化供应(生产)VMI(VendorManageInventory)供应商库存管理,即客户的原料属于供应商,并由供应商管理MRO(Maintenance,RepairandOperating)指维修与作业耗材,也可解释为非生产... 查看详情

深入理解dalvik虚拟机-解释器的运行机制(代码片段)

...知,解释器的效率是相对较低的,所以出现了JIT(JustInTime),JIT是将执行次数较多的函数, 查看详情