执行引擎、逃逸分析、JIT即时编译

JIT(即时编译)是什么? JIT(即时编译)是一种运行时将字节码动态编译为本地机器码的技术,兼具解释执行的灵活性和编译执行的高效性。其核心流程包括:解释执行字节码、识别热点代码、动态编译优化并替换执行。JIT广泛应用于Java JVM、JavaScript引擎等场景,通过运行时优化实现接近原生代码的性能。这种"空间换时间"策略既保留了跨平台优势,又显著提升了执行效率,成为现代高性能虚拟机的关键技术。 阅读详情

执行引擎是什么?

执行引擎是JVM的一套子系统,当程序运行的时候,执行引擎就开始工作了;在 Java 虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行引擎的统一外观(Facade)。在不同的虚拟机实现里,执行引擎在执行 Java 代码的时候可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种方式,也可能两者都有,甚至还可能会包含几个不同级别的编译器执行引擎。但从外观上来看,所有 Java 虚拟机的执行引擎是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。

java的两种解释器

java为什么会出现两种解释器,在java之初,java只有字节码解释器,但是字节码解释器是由c++程序完成的,就是我们所编写的程序要通过c++来生成计算机能识别的硬编码,而这样也不能说运行效率很低,肯定没有直接生成硬编码效率高,而这种字节码解释器模式下,很多C++程序员其实是看不起JAVA程序员的,你JAVA程序员写的代码还要我C++帮你完成硬编码的解释执行,其实这种情况在国外比较突出;所以后来有些大牛就想,我是否可以实现自己直接编译成硬编码,不需要通过c++来转换成硬编码,所以后来就诞生了java的模板解释器;那么我现在的java到底默认使用的模板解释器还是字节码解释器,其实我们的java默认使用的是字节码+模板解释器的,下面会有讲到。

即时编译

字节码解释器

java字节码-> C++代码->硬编码(05 06 07)
比如:

public class T0806 {

    public static void main(String[] args) {
        T0806_1 t = new T0806_1();
        System.out.println(t);
    }

}

class T0806_1{

    public T0806_1(){
        System.out.println("init ...");
    }
}

main方法生成的字节码为:

0 new #2 <com/bml/t0816/T0806_1>
 3 dup
 4 invokespecial #3 <com/bml/t0816/T0806_1.<init>>
 7 astore_1
 8 getstatic #4 <java/lang/System.out>
11 aload_1
12 invokevirtual #5 <java/io/PrintStream.println>
15 return

那么字节码解释器在C++中是如何运行的?
其实C++在为我们解释执行的时候是这样的:
一行一行的解释,也就是一个for或者while循环:

whil(条件){
    char code = xxx;
    switch(code){
    case new:
        ....
    break;
    case dup:
        ....
        break;
    }
   
}

其实就是读取我们的每一行代码,根据获取到的字节码指令,执行相应的操作,我这边截取了openjdk底层代码使用字节码解释器的代码片段(c++):

CASE(_new): {
        u2 index = Bytes::get_Java_u2(pc+1);
        ConstantPool* constants = istate->method()->constants();
        if (!constants->tag_at(index).is_unresolved_klass()) {
          // Make sure klass is initialized and doesn't have a finalizer
          Klass* entry = constants->slot_at(index).get_klass();
          assert(entry->is_klass(), "Should be resolved klass");
          Klass* k_entry = (Klass*) entry;
          assert(k_entry->oop_is_instance(), "Should be InstanceKlass");
          InstanceKlass* ik = (InstanceKlass*) k_entry;
          if ( ik->is_initialized() && ik->can_be_fastpath_allocated() ) {
 ……

其实原理就是上述的例子所述;我们这里不是要研究opdnjdk源码,贴出源码是为了把原理搞清楚。

模板解释器

要做的事情就是:java字节码->硬编码
1.申请一块内存,这块内存可读可写可执行(mac底层虽然是uninx,但是为了保护作用,mac是无法运行JIT的,也就是说mac无法申请到可执行的内存空间);
2.如果遇到我们的new关键字或者dup,那么这是字节码指令,那么模板解释器会直接将new或者dup相应的硬编码拿过来;
3.将处理new或者其他字节码指令的硬编码指令直接写入申请到的内存空间中;
4.申请一个函数指针,用这个函数指针来执行这块内存(函数指针->执行函数的指针);
5.程序调用的时候,直接通过这个函数的指针就可以调用了。

两种解释器执行流程

在这里插入图片描述
上图中就是对两种解释器的一个图形表示,和之前的描述区别用图形来表示,如果是字节码解释器,那么会通过C++中的代码来生成硬编码,而模板解释器会直接生成硬编码。

JIT(即时编译)的三种运行模式

-Xint: 纯字节码解释器模式
-Xcomp: 纯模板解释器模式
-Xmixed:字节码解释器+模板解释器 模式
那么我的的jdk默认是用的那种解释器呢?那种解释器的效率高呢?
其实jdk默认使用的是-Xmixed解释器,就是混合解释器,既有字节码解释器也有模板解释器,程序运行的初期使用的是字节码解释器,当运行后期,使用的是模板解释器,其实是由参数控制的,这个后面说;
我们在cmd中执行:

$ java -version
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)

看到我们的jdk是以server模式运行的,并且是mixed mode,所以我们的jvm是以字节码解释器+模板解释器运行的
上面的三种模式中,纯模板解释器运行效率更高,但是核mixed差不不大,而且程序很小的时候,用字节码更快,而纯模板解释器用于程序非常大的情况下,所以混合解释器在整体性能上最优;
如果需要使用非默认的解释器,在启动参数中加入相应的解释器参数即可。

java中两种即时编译器

1、C1编译器

-client模式启动,默认启动的是C1编译器。有哪些特点呢?
1、需要收集的数据较少,即达到触发即时编译的条件较宽松
2、自带的编译优化优化的点较少
3、编译时较C2,没那么耗CPU,带来的结果是编译后生成的代码执行效率较C2低

2、C2编译器

-server模式启动。有哪些特点呢?
1、需要收集的数据较多
2、编译时很耗CPU
3、编译优化的点较多
4、编译生成的代码执行效率高

3、混合编译

目前的-server模式启动,已经不是纯粹只使用C2。程序运行初期因为产生的数据较少,这时候执行C1编译,程序执行一段时间后,收集到足够的数据,执行C2编译器

Mac中是无法使用JIT的!因为Mac无法申请一块可读可写可执行的内存块
即时编译生成的代码就是给模板编译器使用的

即时编译启动触发条件

即时编译的最小单位不是一个函数或者方法,而是代码块(如for while等)
我们可以通过命令来查看我们的及时编译器执行次数的配置:

java -XX:+PrintFlagsFinal -version|grep CompileThreshold
     intx CompileThreshold                          = 10000           {pd product}
    uintx IncreaseFirstTierCompileThresholdAt       = 50              {product}
     intx Tier2CompileThreshold                     = 0               {product}
     intx Tier3CompileThreshold                     = 2000            {product}
     intx Tier4CompileThreshold                     = 15000           {product}
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)

Client 编译器模式下, CompileThreshold 默认的值 1500
Server 编译器模式下,CompileThreshold 默认的值则是 10000
这个是jdk默认的值,我们给jvm调优可以调这个参数,但是要特别注意,不是非常清楚最好别去修改默认值。

在这种模式下,比如我们的某个代码块,达到即时编译的条件执行了,但是如果长时间没有执行的情况下,会推出模板解释的条件,这个就是热度衰减的概念;
很简单的例子就是我们的开通了某app的会员,如果你到期了没有续费,那么它的成长值会衰减,一样的道理,所以如果我们设置的程序执行达到了3000次执行,那么退出了模板解释器过后,会往下以2倍的速度衰减,要达到之前的条件,会多执行一倍才行。

热点代码缓冲区

热点代码是什么?热点代码就是我们的硬编码,也就是模板解释器生成的硬编码,那么模板解释器启用过后不可能每次都为我们在生成一个硬编码,那么它会把它缓存起来,那么缓存到哪里呢?
热点代码缓存在我们的方法区中;那么在方法区,那么会不会溢出呢?就是出现oom的异常呢?
其实不会出现,它内部有一种淘汰机制,和redis的淘汰机制类似,LRU,所以不会出现OOM的异常。
那么热点代码缓存区到底多大呢?jvm默认的大小如下:
server 编译器模式下代码缓存大小则起始于 2496KB
client 编译器模式下代码缓存大小起始于 160KB
注:jdk在64为下默认为server模式,没有client模式,client模式在32位机器下才会有
指定用 java -client启用client模式

$ java -XX:+PrintFlagsFinal -version|grep CodeCache
    uintx CodeCacheExpansionSize                    = 65536           {pd product}
    uintx CodeCacheMinimumFreeSpace                 = 512000          {product}
    uintx InitialCodeCacheSize                      = 2555904(2496k)         {pd product}
     bool PrintCodeCache                            = false           {product}
     bool PrintCodeCacheOnCompilation               = false           {product}
    uintx ReservedCodeCacheSize                     = 251658240       {pd product}
     bool UseCodeCacheFlushing                      = true            {product}
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)

所以CodeCache这个参数也是我们调优的一种,但是也是要非常了解系统架构的情况下去调优,否则还是用默认比较好,调优可以调这两个参数:
InitialCodeCacheSize
ReservedCodeCacheSize

即时编译是如何运行的?

其实即时编译和GC都是使用的jvm的内部线程VM_THREAD,它内部维护了一个队列,当队列中有请求线程加入的时候,就会去运行,并且即时编译是异步执行的,那么执行即时编译的线程有多少个,怎么去调优呢?

$ java -XX:+PrintFlagsFinal -version|grep CICompilerCount
     intx CICompilerCount                           = 2               {product}
     bool CICompilerCountPerCPU                     = true            {product}
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)

CICompilerCount看这个参数,也就是我们的即时编译的内部线程只有2个,我们可以通过这个参数进行调优;
这边分享一个多年前遇到的一个案例,那个时候我们的银行系统采用的是热冷模式,也就是我们的系统一直运行在热机上,冷机作为灾备,当有天热机出现问题,切换到冷机机房时,出现了大量的请求缓慢以至于系统卡机,导致交易的失败率非常高,导致于最后系统直接挂掉;
这个问题我当时查了好久好久都没有解决,两边机器的配置一模一样,程序配置一模一样,系统参数已调至最优,但是一直没有查到,后面无意间看到jvm的的热点代码缓存区才恍然大悟;
因为我们的热机已经缓存大量的热点代码,可抗住很大的并发,而冷机还未执行过请求,所以突然大并发交易进来就会出现执行缓慢,当并发达到一定的程度,无法即时处理而出现宕机。

为什么说java是半解释半编译的语言

1.javac编译,java运行;
2.字节码解释器解释执行,模板解释器编译执行

逃逸分析

逃逸分析这个词可要拆成两个词来理解:逃逸、分析(逃逸分析默认是开启的)

什么情况下有逃逸,什么情况下需要分析?
什么叫逃逸?
说白了就是共享变量、返回值、参数等,一句话概括就是这个变量不是局部的
比如我们的方法返回值,当这个方法执行完成过后,那么这个返回值就逃逸了,我们没有办法控制它了,共享变量也是一个道理。总结出来就是两种情况:
方法外
线程外
这两种存在逃逸
什么叫不逃逸
就是对象的作用域是局部的,就没有办法逃逸
分析:
分析是一种技术手段,为什么要对对象的逃逸进行分析?
因为需要对其进行优化,优化代码的执行
基于逃逸分析,JVM开发了三种优化技术

标量替换

标量:不可再分,java中的基本数据类型(8中基本数据类型)就是标量
聚合量:可再分,对象

class T0806_1{
     public static int x = 2;
     public static int y =3;
    public T0806_1(){
        System.out.println("init ...");
    }
}


class T2{
    public static void main(String[] args) {

        System.out.println(T0806_1.x);
        System.out.println(T0806_1.y);
    }
}

我们注意看

System.out.println(T0806_1.x);
System.out.println(T0806_1.y);

这两行代码,在逃逸分析中进行优化了,在运行的时候其实我们看到的是

System.out.println(2);
System.out.println(3);

这就是标量替换

锁消除

什么是锁消除,就是这个锁根本没什么用,jvm在做逃逸分析时,进行了锁消除,
比如我们看以下代码:

synchronized (new Object()){
    System.out.println(T0806_1.x);
    System.out.println(T0806_1.y);
}

其实在方法中,这个synchronized根本就没有起作用,是一个无用的锁,所以,代码在执行的时候就进行锁消除,就是根本就没有synchronized的代码了,在运行的时候其实是:

System.out.println(T0806_1.x);
 System.out.println(T0806_1.y);

这就是锁消除,jvm在逃逸分析的时候进行消除

栈上分配

逃逸分析如果是开启的,栈上分配就是存在的
通过代码测试

对象在堆区分配
对象在虚拟机栈上分配

-XX:+/-DoEscapeAnalysis(这个参数就是开启栈上分配)

空了可以测试下栈上分配,我们可以创建10w个对象,通过HSDB这个工具通过开启栈上分配和关闭栈上分配来查看是否存在

JIT(Just-In-Time Compilation,即时编译)技术 JIT(即时编译)技术是一种在程序运行时动态生成机器码的编译方法,结合了解释执行的灵活性和静态编译的高效性。其核心原理包括动态编译、利用运行时信息进行优化以及缓存重用。JIT的工作流程分为解释执行、热点检测与触发编译、编译与优化、执行与缓存管理四个阶段。JIT广泛应用于Java虚拟机、JavaScript引擎、动态语言运行时和高性能计算等领域,具有性能接近原生代码、跨平台兼容性和动态适应能力等优势,但也面临启动延迟、内存占用和复杂保护对抗等挑战。未来,JIT技术将朝着智能化优化、跨平台支持和与AOT结合的方 阅读详情

相关推荐

Signoff Criteria --- ocv/aocv/pocv之AOCV介绍

Advanced on chip variation,相比较于OCV来说,对于悲观度的去除很有效。相比较与ocv对于整个design中的lauch/capture path设置统一的derate值,aocv通过将cell derate值与cell的逻辑深度以及实际的位置结合起来进行derate值的设定。那么这种derate如何能够设置到具体的cell呢,其实是我们在跑STA时候会读入相关的aocv lib file,里面有专门对相关的cell进行的aocv derate值的描述。> table: \

sinat_27691203的博客 7856

取经之路 - Android性能优化

文章目录Android性能 - 绘制Android性能 - 启动Android性能 - 布局Android性能 - 内存Android性能 - 卡顿Android性能 - 异步Android性能 - 瘦身Android性能 - 电量Android性能 - 网络Android性能 - 无响应Android性能 - Bitmap Android性能 - 绘制 Android系统16毫秒发出一个信号...

Primer5 1228

802.1x之EAP-TLS测试方法

CA证书一般是由权威的认证机构发出,用来验证该机构签名的证书,持有CA证书的设备可以验证对端的证书是否由自己信任的机构颁发的。在我们内部使用证书时,我没可以自己充当CA认证机构,管理私钥和CA证书,使用他们签名服务器、客户端证书。2、使用证书请求文件server_csr.pem、CA私钥、CA公钥生成服务器证书(正常情况下自己不拥有CA私钥,是把证书请求文件发给认证机构,由认证机构返回证书)进行802.1x EAP-TLS认证时需要IPC、服务器分别存储CA证书、设备证书、私钥,通过交换证书实现身份验证。

写作是为了更好的思考 2165

安卓线程学习五 之 HelloWorld app运行时线程资源分析

一 抛出问题 一个最普通的 HelloWorld app运行以后,总共会开启多少线程,这些线程分别是什么作用,线程的status是什么? 二 分析 helloworld app运行以后,打开Android Studio — Tools — Android — Android Device Monitor ,查看Threads信息,如图所示: 总共有14个线程 2.1.虚拟机线...

读书未遍、未敢妄下雌黄 2224

华中农业大学C++考试基础练习题

实验一 1 通过日期求某月的天数。 输入日期的年份和月份,求该月有多少天。提示:对于月份为1、3、5、7、8、10、12的月份天数为31,月份为4、6、9、11的月份天数为30,月份为2时要结合年份考虑闰年的情况。 输入描述 输入两个正整数y和m分别表示年份和月份。 输出描述 如果y和m满足条件:1900<=y<3000,0<m<13,输出该月的天数;否则输出“Input error!”。 输入样例 2010 12 输出样例 31 #include"iostream" using n

雨的博客 1万+

IDEA系列(四):IDEA导入Maven工程项目并配置Tomcat启动

本片文章主要介绍如何导入一个存在的maven项目并配置Tomcat启动项目,方便自己使用,也分享出来,希望可以帮助到其他人。

低调D树苗的博客 1244

ThreadPool

new Thread的弊端如下: a. 每次new Thread新建对象性能差。 b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。 c. 缺乏更多功能,如定时执行、定期执行、线程中断。 相比new Thread,Java提供的四种线程池的好处在于: a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。 b. 可有效控制最

rabbit_in_android的博客 548

Windows 11安装 SQLServer 2008 R2 失败问题处理

Windows 11安装SQL Server 2008 R2失败解决方案 由于Windows 11移除了对PowerShell 2.0的支持,导致SQL Server 2008 R2安装失败。经过多次尝试,最终通过**方案六(修改注册表模拟PowerShell 2.0环境)**成功安装。其他可行方案包括: 使用SP3集成版安装包 通过命令行跳过检查(/SUPPRESSPOWERShellCHECK参数) 创建特殊配置文件 替代方案建议: 使用Docker容器运行 在虚拟机中安装 升级到新版SQL Serve

oDengWei的博客 7199

高通平台稳定性分析-hungtask causing panic-Low_memory

使用ramparser解析后: 1、dmesg_TZ.txt【panic信息、调用栈信息、其他打印信息】 搜索panic 看到: (3)[71:khungtaskd]Task Jit thread pool:2581 blocked for 120s is causing panic (3)[71:khungtaskd][RB/E]rb_sreason_str_set: sreason_str set hungtask (3)[71:khungtaskd]Kernel panic - not syn

thonmin的专栏 1004

电源芯片TPS54560典型应用电路及设计详解

TPS54560 是一款配有集成型高侧 MOSFET 的 60V、5A DC-DC转换器,输入电压范围7-60V,输出电压可通过外部反馈电阻设置成略低于输入电压的任意值。**所以,**R5=31.25KΩ、R6:10KΩ(常用值)时,即可设置输出电压为 3.3V。**所以,**R5=140KΩ、R6:10KΩ(常用值)时,即可设置输出电压为12V。设计 TPS54560 的输出电压时,主要通过外部反馈电阻网络来设置输出电压。因此,输出 3.3V ,输入电压24V时推荐的电感值为 8µH 至 10µH。

weixin_42306872的博客 1万+

Origin作图——等高线图

最近做一个测试数据图,开始想通过用热图来展示,结果发现热图有很多的小方块,很难呈现出最好的效果,因为数据是有一层一层的递进效果,因此经过尝试后,发现等高线图是个好选择。 热图展示效果如下:其中有很多的小方块不适合,热图制图方法前面有记录。 下面展示等高线图制作方法。首先是导入数据,可以从excal导入,也可以直接复制进去。等方法。 选中要展示的数据,绘图----等高线图 选中箭头,确定。 双击图像,点击线,我们需要把线隐藏了. 双击图像,我们需要调色板,根据自己的选择,一般用调色板的颜色。

qq_42278015的博客 1万+

01-JUC--ThreadPool

线程池简介 这篇文章写的好。放个连接,是一个非常好的阅读材料。 美团技术团队:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。 线程池的重要性 如果不使用线程池,每个任务都新开一个线程处理。 1.一个线程 2.for循环创建线程 3.1000个线程 这种方式开销太大,我们希望有固定数量的线程,来执行这个10

qq_41729287的博客 835

Wazuh部署记录

Wazuh是一个免费的开源安全平台,统一了XDR和SIEM功能。它可以保护内部部署、虚拟化、容器化和基于云的环境中的工作负载。Wazuh帮助组织和个人保护其数据资产免受安全威胁。它被全球数千个组织广泛使用,从小型企业到大型企业。443:仪表盘界面访问端口1515:探针连接服务器端口1514:探针回传信息端口以上3个端口必须打开防火墙。

墨痕诉清风的博客 1562

【JVM】执行引擎、JIT、逃逸分析(二)

针对的是热点代码(触发JIT的条件)Client模式:32bit才有Server模式:64bit触发条件后,谁来编译,编译线程C1:Client模式下C2: Server模式下JDK6之后,混合在一起,热点代码((统计的并不是被调用的绝对次数,而是一个相对的执行频率,一段时间内方法被调用的次数))其中包括但是热点代码会有一个热度衰减的概念,

Cover_sky的博客 1793

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JVM执行引擎:核心原理与优化策略

在当今的软件开发领域,Java虚拟机(JVM)作为Java程序执行的平台,其核心知识点之一——执行引擎,扮演着至关重要的角色。想象一下,一个大型企业级应用,其业务逻辑复杂,数据处理量大,若没有高效稳定的执行引擎,那么程序的运行效率将大打折扣,甚至可能导致系统崩溃。执行引擎是JVM的核心组成部分,它负责将Java字节码转换为机器码,并执行这些机器码。在具体的应用场景中,我们可以遇到这样的问题:一个复杂的Java应用,在执行过程中,由于执行引擎的效率低下,导致程序响应缓慢,用户体验不佳。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 656

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

执行引擎执行代码底层实现

执行引擎执行代码底层实现 解释器 字节码解释器 java字节码->c++ ->硬编码(汇编) 其实是switch case 将java转成c++语言 模板解释器 java字节码 ->硬编码(汇编) JIT即时编译 模板解释器直接编译成硬编码,存储在方法区 jvm三种执行方式(执行引擎执行java字节码的运行方式) 1、Xint 纯字节码解释器 2、Xcomp 纯即时编译斜体样式 3、Xminxed 混合式(默认) 为什么使用混合模式? 项目越大编译时间耗时过长 热机切冷机故障(阿里) c

方方园园的博客 271

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JVM--7-深入探秘JVM执行引擎:字节码翻译的艺术与即时编译的智慧

以字节码指令为驱动,逐条执行对应操作;以栈帧为上下文容器,管理方法执行过程中的数据与返回信息;以运行时数据区为支撑,获取执行所需的各类数据。解释执行是指执行引擎由解释器(Interpreter)逐条读取字节码指令,实时翻译为对应的机器指令,然后立即执行,循环往复,直到所有指令执行完毕。JIT 编译是指JVM 在运行时,将频繁执行的字节码(“热点代码”)一次性编译为机器指令,并缓存起来,后续直接执行缓存代码。JIT 基于二八定律:80% 的执行时间集中在 20% 的代码上。

weisian的博客 1万+

JVM执行引擎深度解析

在开发大型Java应用时,我们常常会遇到这样的问题:随着代码量的增加,应用的性能逐渐下降,尤其是在处理复杂逻辑和大量数据时,系统响应速度变得缓慢。这其中的一个关键因素就是JVM的执行引擎。为了更好地理解这一问题,下面我们通过一个场景来引出JVM执行引擎的介绍。场景描述:假设我们正在开发一个在线交易系统,该系统需要处理大量的并发请求,并对交易数据进行实时分析。在系统运行初期,一切运行顺畅。然而,随着时间的推移,我们发现系统在处理复杂交易逻辑时,响应时间越来越长,甚至出现了卡顿现象。

AIHacksCash的博客 1105

V8是怎么执行JS代码的

1、V8的演进历史 2008年V8发布第一个版本,当时的V8架构比较激进,直接将js代码编译为机器码并执行,所以执行速度很快,但是只有Codegen一个编译器,所以对代码的优化很有限。 2010年V8发布了Crankshaft编译器,js代码会先被Full-Codegen编译器编译,如果后续改代码块会被多次执行,则会用Crankshaft编译器重新编译,生成更优化的代码,之后就使用优化后的代码来执行,进而提升性能。 Crankshaft编译器对代码的优化有限,所以2015年V8中加入了TurboFa

hfhan的博客 960

JVM09执行引擎

执行引擎属于JVM的下层执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。

欧气满满大顺顺的博客 375

【JVM】12、执行引擎

执行引擎执行引擎概述执行引擎执行引擎的工作过程Java 代码编译和执行过程解释执行和即时编译解释器JIT编译器机器码、指令、汇编语言机器码指令和指令集汇编语言高级语言字节码 执行引擎概述 执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器 执行引擎 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受

flora 198

【JVM】执行引擎、JIT、逃逸分析(一)

分成两个角度来看1.触发JIT之前javac编译,java运行2.触发JIT之后,运行期即时编译(C1、C2)+解释执行(模板解释器比字节码解释器高效很多)

Cover_sky的博客 1916

JIT即时编译与编译优化

写在前面: 1,java是编译型语言还是编译型语言? 像C、C++ 他们经过一次编译之后直接可以编译成操作系统了解的类型,可以直接执行的,所以他们是编译型的语言。没有经过第二次的处理。而Java不一样,他首先由编译器编译成.class类型的文件,这个是java自己类型的文件 然后在通过虚拟机(JVM)从.class文件中读一行解释执行一行,所以他是解释型的语言,而由于java对于多种不同的操作系统有不同的JVM,所以,Java实现了真正意义上的跨平台! 一、你可以说它是编译型的:...

Bolg of EQuaker 1360

执行引擎、JIT、逃逸分析

执行引擎就是 JVM运行Java程序的一套子系统 Java是半编译半解释型语言 如果面试官问你这个问题,要分成两个角度来讲解 ​ 1、javac编译,java运行 ​ 2、运行期即时编译+解释执行(字节码解释器解释执行,模板解释器编译执行) 两种解释器的底层实现 JVM中目前来说有两种解释器 具体细节见课堂上操作实战 1、字节码解释器 做的事情是:java字节码->c++代码->硬编码 根据不同的字节码指令,执行不同的操作。比如下面代码 0 new #4 <com/luban/tes.

milo 402

深入解析 JVM 性能优化:JIT、逃逸分析与编译阈值的协同机制

JIT 即时编译(Just-in-time Compilation,JIT)是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。在HotSpot实现中有多种选择:C1、C2和C1+C2,分别对应client、server和分层编译。 1、C1编译速度快,优化方式比较保守; 2、C2编译速度慢,优化方式比较激进; 3、C1+C2在开始阶段采用C1编译,当代码运行到一定热度之后...

ywl470812087的博客 9万+

JVM 即时编译(JIT)机制详解

本文深入探讨了JVM中的即时编译(JIT)技术,强调了其在提升Java应用性能中的核心作用。文章首先对比了解释器与JIT编译器的执行模式,指出JIT通过将热点代码编译为机器码来优化执行效率。接着,详细介绍了JVM如何识别热点代码,并分析了C1和C2两种编译器的特点及其适用场景。此外,文章还探讨了JIT编译器的多种优化技术,如方法内联、循环展开、去虚拟化和逃逸分析等,并通过实际案例展示了如何诊断和优化JIT编译性能。

zhangxzq的博客 1483
上一篇: String字符串
下一篇: 并发编程之JMM模型&Volatile底层原理
Life  journey
博客等级 码龄17年 1万+粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值