Java 中的 JIT 和 AOT

news2025/4/17 6:15:09

我们都知道,Java 是一种半编译型,半解释型的语言,其编译部分和 C++ 语言比较类似,解释部分和 Python 语言比较类似,而 Java 则是综合了两种方式的语言。

一、编译与解释

1.1 编译型语言

所谓编译,就是将程序的源代码转换成可以直接运行的二进制文件,每一个程序编译后产生的二进制文件是不同的,程序的源代码就算是只经过了轻微的更改,也要对更改的源代码文件全部重新进行编译,若源代码很多,编译速度很慢,那么调试和运行就成为了一种麻烦,从而导致程序开发效率低下,这是编译型语言的缺点。但与之相对的就是,编译后产生的二进制文件可以直接在对应的操作系统上运行,程序的各项性能都会很高。典型的编译型语言就是 C++,C++ 程序的效率非常高。为了进一步加快程序的启动速度,就发展而来了 AOT 技术。

1.2 解释型语言

所谓解释,就是由虚拟机(一种软件)对一段文本或者一个文件的内容进行分析并作出相应反应。由于解释型语言只是对文本或文件做出解释,没有编译的过程,因此,源代码文件修改了一点点,对解释器而言区别并不是很大,调试和运行速度也不会由太大的区别,进而提高了程序的开发速度,这就是解释型语言的优点。但与之相对的就是,程序的运行速度和效率会降低,因为解释器要解释的文本或文件实际上要转换成解释器可以高效解释的中间代码(有时也叫字节码),再让解释器去运行,这样的程序运行效率十分低下。典型的解释型语言就是 Python,而软件 Python 就是虚拟机。为了进一步加快程序的运行速度,就发展而来了 JIT 技术。

1.3 虚拟机

虚拟机是指用于解释程序源代码的一种软件,为什么叫虚拟机呢?因为与之相对的就是非虚拟的机器,也就是真实的机器,比如我们的电脑,这就是真实的机器,而操作系统就是运行在这个真实机器上的“虚拟机”,Java、Python 等就是“虚拟机”中的虚拟机。无论是什么程序,最终都是要变成机器码来让机器来执行的,那么在虚拟机中的虚拟机这一过程中,嵌套地越深就离真实的物理机器“越远”,程序的执行效率就越慢,因为执行过程中有层层的转换过程。我们都知道,在程序的运行效率上 C++ > Java > Python。这就是因为 C++ 离真实物理机器“近”,而 Python 离得“远”。

1.4 Java 为什么能“一次编译,到处运行”?

从上面我们可以知道,Java 是半编译、半解释型的语言,当 Java 对源代码进行编译的时候,是通过编译器 javac 将 java 文件编译成了 class 后缀的字节码文件,然后再让解释器 JVM 对 class 字节码文件进行解释,从而达到跨平台的目的。

二、JIT 与 AOT

2.1 JIT 的原理

即时编译(Just In Time)简称 JIT,即程序在运行时对热点代码进行编译,以达到加快运行速度的目的。

解释型语言想要运行得快,就只能朝着编译的方向发展,但又无法完全编译,于是就有了 JIT 技术。在解释运行的过程中,如果发现执行得非常频繁的代码(我们称之为热点代码 —— Hot Spot Code),就将这部分代码编译并缓存起来,用的时候调用编译后的文件,于是就达到了加速的目的。而我们之前提到过,Java 是半编译、半解释型的语言,当 Java 对源代码进行编译的时候,是通过编译器 javac 将 java 文件编译成了 class 后缀的字节码文件,然后再让解释器 JVM 对 class 字节码文件进行解释,从而达到跨平台的目的。这一过程中既有编译,也有解释。而在解释的过程中,JIT 就发挥它的作用了。

JIT 加速过程

不仅仅在 Java 语言中有 JIT 的应用,在 Python 等语言中也有 JIT 的出现。总的来说,JIT 的吞吐量高,有运行时性能加成,程序可以跑得更快,并可以做到动态生成代码等,但是相对启动速度较慢,并需要一定时间和调用频率才能触发 JIT 的分层机制。

当然,Java 中 JIT 技术的应用不仅仅只有热点代码的编译,还有其他很多方面的优化。

2.2 热点代码

关于 JIT 是怎么确定哪些代码是热点代码的这个问题,下面作简单的介绍。简单地说,当一段代码被执行了很多次时,它就会被 JIT 认定为热点代码。具体地说,有两种确定方式:

基于采样的热点探测(Sample Based Hot Spot Detection)

基于计数器的热点探测(Counter Based Hot Spot Detection)

2.3 AOT 的原理

预先编译(Ahead Of Time)简称 AOT,即程序在运行之前就编译好代码,以达到加快启动速度的目的。

预先编译,也叫做静态编译,也就提前分析代码的结构,进行相应的优化后再直接编译成二进制文件,无需经过解释器解释,直接由平台运行。运行 AOT 技术的程序内存占用低,启动速度快,可以直接运行,但是无运行时的性能加成,且不能根据程序运行情况做进一步的优化。典型的就是 gcc 中的 o1、o2 以及 o3 优化了,它们就属于编译优化,提高编译后程序的质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/884721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ClickHouse(二十):Clickhouse SQL DDL操作-2-分区表DDL操作

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…

TienChin 引入 MyBatisPlus

在父工程当中添加版本号&#xff0c;统一管理&#xff1a; <mybatis-plus.version>3.5.1</mybatis-plus.version> 在父工程当中添加 MyBatisPlus 依赖&#xff1a; <!--MyBatis Plus--> <dependency><groupId>com.baomidou</groupId><a…

单链表相关操作(头插法和尾插法)

目录 1.尾插法建立单链表 带头结点 不带头节点 用户输入建立单链表 带头结点 不带头结点 2.头插法建立单链表 带头结点 用户输入建立单链表 带头结点 不带头结点 头插法和尾插法最大区别在于&#xff0c;尾插法可以顺序输出用户输入的元素&#xff0c;头插法则是逆序…

读高性能MySQL(第4版)笔记02_MySQL架构(下)

1. 事务日志 1.1. 事务日志有助于提高事务的效率 1.1.1. 存储引擎只需要更改内存中的数据副本&#xff0c;而不用每次修改磁盘中的表&#xff0c;这会非常快 1.1.2. 更改的记录写入事务日志中&#xff0c;事务日志会被持久化保存在硬盘上 1.2. 事务日志采用的是追加写操作&…

AMD Zen4最后一招!64核心只需200W

AMD Zen4已经布局得差不多了&#xff0c;不过在服务器上还有最后一招&#xff0c;那就是面向边缘计算、电信基础设施等不需要太强性能、但对功耗和能效很敏感的Siena系列。 Zen4霄龙已经发布了三个系列&#xff0c;标准的Genoa(96核心)、集成3D缓存的Genoa-X(96核心/1152MB三级…

关于牛津大学暑研项目的总结和收获

关于牛津大学暑研项目的总结和收获 关于这篇博客主要是想记录一下这次项目的一些收获和心得&#xff0c;一如三年前参与新加坡国立大学的寒研项目一样。我这次的参加的日期是在八月份的数学&#xff0c;物理和计算机类的&#xff0c;这次分享的内容主要集中在学术、生活和思维…

生信豆芽菜-TMEscore预测免疫浸润程度

网址&#xff1a;http://www.sxdyc.com/immuneTmeScore 一、TMEscore预测免疫浸润程度介绍 使用TMEscore包预测患者免疫浸润程度;参考文章Cancer Immunology Research, 2019, 7(5), 737-750;DOI: 10.1158/2326-6066.CIR-18-0436;PMID: 30842092 二、使用方法 1、数据准备 一个全…

单片机串口通讯实战:详解STM32的串口编程与数据传输

引言&#xff1a; 单片机串口通讯是应用非常广泛的通讯方式&#xff0c;具有简单、灵活、稳定等特点。本文将深入探讨单片机串口通讯的原理、应用和性能优化&#xff0c;同时介绍如何使用STM32单片机进行串口编程&#xff0c;并提供详细的代码示例和注释。 一、单片机串口通讯…

都错了!机械硬盘远比SSD更省电 最多领先94%

相信在绝大多数人的认知中&#xff0c;SSD固态硬盘因为没有HDD机械硬盘那样的移动部件&#xff0c;不但更稳定&#xff0c;还更省电。 但是&#xff0c;存储服务商Scality的研究表明&#xff0c;恰恰相反&#xff0c;HDD更省电。 他们以美光6500 ION 30.72TB QLC SSD、希捷银河…

如何安装Python?

如何安装Python&#xff1f; 安装Python非常简单&#xff0c;让我们一步步来进行。 1. 访问官方网站 首先&#xff0c;您需要访问Python官方网站&#xff08;https://www.python.org/&#xff09;。在首页上&#xff0c;您会看到一个大大的「Downloads」按钮&#xff0c;点击…

深信服数据中心管理系统 XXE漏洞复现

0x01 产品简介 深信服数据中心管理系统DC为AC的外置数据中心&#xff0c;主要用于海量日志数据的异地扩展备份管理&#xff0c;多条件组合的高效查询&#xff0c;统计和趋势报表生成&#xff0c;设备运行状态监控等功能。 0x02 漏洞概述 深信服数据中心管理系统DC存在XML外部实…

Python的变量命名规则是什么?

Python的变量命名规则 在Python中&#xff0c;变量是用来存储数据的&#xff0c;而变量命名是为了方便我们理解和引用这些数据。Python的变量命名规则相对灵活&#xff0c;但也有一些基本规则和约定&#xff0c;让我们一起来了解一下。 基本规则 只能包含字母、数字和下划线&…

使用 flatMap 进行扁平化映像处理数据

实战背景 &#xff1a; 小伙伴遇到了数据处理方面的问题如下 &#xff1a; 只能说看到这里我也一头雾水&#xff0c;毕竟我也是菜&#x1f436;&#xff0c;那就请教大佬吧 &#xff1a; Map.flat 循环 二维 变 一维 就是 flatMap 了 啊这&#xff0c;&#xff0c;但是 flatM…

[python] 安装numpy+scipy+matlotlib+scikit-learn及问题解决

这篇文章主要讲述Python如何安装Numpy、Scipy、Matlotlib、Scikit-learn等库的过程及遇到的问题解决方法。最近安装这个真是一把泪啊&#xff0c;各种不兼容问题和报错&#xff0c;希望文章对你有所帮助吧&#xff01;你可能遇到的问题包括&#xff1a; ImportError: N…

Spring Boot+ redis执行lua脚本的5种方式

Spring Boot redis执行lua脚本示例 文章目录 Spring Boot redis执行lua脚本示例0.前言1.基础介绍2.步骤2.1. 引入依赖1. 使用Jedis作为Redis客户端&#xff1a;2. 使用Lettuce作为Redis客户端&#xff1a; 2.2. 配置文件使用Jedis作为Redis客户端的配置文件&#xff08;applica…

突破防线!泛微OA任意文件上传Getshell

子曰&#xff1a;“巧言令色&#xff0c;鲜矣仁。” 漏洞复现 访问漏洞url&#xff1a; 存在漏洞的路径为 /weaver/weaver.common.Ctrl/.css?arg0com.cloudstore.api.service.Service_CheckApp&arg1validateApp漏洞利用&#xff1a; 漏洞证明&#xff1a; 文笔生疏&…

2021年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;统计指定范围里的数 给定一个数的序列S&#xff0c;以及一个区间[L, R], 求序列中介于该区间的数的个数&#xff0c;即序列中大于等于L且小于等于R的数的个数。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 第一行1个整数n、&#xff0c;分别表…

Intel 12代酷睿集体大降价!三折太离谱了

之前有德国媒体报道称&#xff0c;Intel 12/13代酷睿以及即将发布的14代酷睿&#xff0c;将会全面涨价。 没想到&#xff0c;12代酷睿大降价了&#xff0c;幅度相当不可思议&#xff0c;不过至少目前仅限美国市场&#xff0c;新蛋、亚马逊、MicroCenter等大型零售商集体行动。 …

C#__匿名方法和Lambda表达式

class Program{static void Main(string[] args){// 匿名方法&#xff1a;方法没有名字Func<int, int, int> plus delegate (int a, int b){return a b;};// 这里相当于直接把要引用的方法直接写在后面// 优点&#xff1a;减少了要编写的代码&#xff0c;减少代码的复杂…

BGP的路由反射器和联邦

1、规划IP及拓扑图 172.16.0.0/16 借到24位 可用范围网段&#xff1a;0-31 172.16.0.0/24 要分6个网段IP借3位 172.16.0.0/27 172.16.0.32/27 172.16.0.64/27 172.16.0.96/27 172.16.0.128/27 172.16.0.160/27 作为骨干网段 172.16.1.0/24 6个建邻环回…