Java之什么是JIT (Just In Time)?

本文介绍了Java虚拟机中的即时(JIT)编译技术,解释了其如何通过将热点代码编译成本地机器码来提升Java程序的执行效率。同时讨论了JIT的工作原理及可能带来的性能影响。

JIT概念

JIT:Just In Time Compiler,一般翻译为即时编译器,这是是针对解释型语言而言的,而且并非虚拟机必须,是一种优化手段,Java的商用虚拟机HotSpot就有这种技术手段,Java虚拟机标准对JIT的存在没有作出任何规范,所以这是虚拟机实现的自定义优化技术。

HotSpot虚拟机的执行引擎在执行Java代码是可以采用【解释执行】和【编译执行】两种方式的,如果采用的是编译执行方式,那么就会使用到JIT,而解释执行就不会使用到JIT,所以,早期说Java是解释型语言,是没有任何问题的,而在拥有JIT的Java虚拟机环境下,说Java是解释型语言严格意义上已经不正确了。

HotSpot中的编译器是javac,他的工作是将源代码编译成字节码,这部分工作是完全独立的,完全不需要运行时参与,所以Java程序的编译是半独立的实现。有了字节码,就有解释器来进行解释执行,这是早期虚拟机的工作流程,后来,虚拟机会将执行频率高的方法或语句块通过JIT编译成本地机器码,提高了代码执行的效率,至此你已经了解了JIT在Java虚拟机中所处的地位和工作的主要内容。

1.JIT的工作原理图
在这里插入图片描述

工作原理

当JIT编译启用时(默认是启用的),JVM读入.class文件解释后,将其发给JIT编译器。JIT编译器将字节码编译成本机机器代码。

通常javac将程序源码编译,转换成java字节码,JVM通过解释字节码将其翻译成相应的机器指令,逐条读入,逐条解释翻译。非常显然,经过解释运行,其运行速度必定会比可运行的二进制字节码程序慢。为了提高运行速度,引入了JIT技术。

在执行时JIT会把翻译过的机器码保存起来,已备下次使用,因此从理论上来说,採用该JIT技术能够,能够接近曾经纯编译技术。

2.相关知识
JIT是just in time,即时编译技术。使用该技术,可以加速java程序的运行速度。

JIT并不总是奏效,不能期望JIT一定可以加速你代码运行的速度,更糟糕的是她有可能减少代码的运行速度。这取决于你的代码结构,当然非常多情况下我们还是可以如愿以偿的。

从上面我们知道了之所以要关闭JITjava.lang.Compiler.disable(); 是由于加快运行的速度。由于JIT对每条字节码都进行编译,造成了编译过程负担过重。为了避免这样的情况,当前的JIT仅仅对常常运行的字节码进行编译,如循环等

Java 是跨平台的,主要归功于 **Java 虚拟机(JVM)** 和 **字节码(Bytecode)** 的设计。这种机制使得 Java 程序可以在任何安装了 JVM 的设备上运行,而无需关心底层操作系统和硬件架构。 --- ### ✅ Java 跨平台的核心机制 1. **源代码编译为字节码** - Java 源代码(`.java` 文件)被编译成一种中间形式的代码:**字节码(.class 文件)**。 - 字节码不是针对特定 CPU 架构的机器码,而是一种与平台无关的指令集。 2. **JVM 解释/编译字节码执行** - JVM 是平台相关的程序,不同操作系统(如 Windows、Linux、macOS)有不同的 JVM 实现。 - JVM 负责将字节码解释执行或通过 **JIT 编译器(Just-In-Time Compiler)** 编译为当前平台的机器码执行。 3. **“一次编写,到处运行”(Write Once, Run Anywhere)** - 只要目标系统安装了合适的 JVM,Java 程序就可以运行,无需重新编译。 --- ### 🔍 举例说明 ```java // Hello.java public class Hello { public static void main(String[] args) { System.out.println("Hello, Java!"); } } ``` 1. 编译: ```bash javac Hello.java # 生成 Hello.class 字节码文件 ``` 2. 运行: ```bash java Hello # JVM 会加载并执行字节码 ``` - 在 Windows 上运行的是 Windows 版本的 JVM。 - 在 Linux 上运行的是 Linux 版本的 JVM。 - 但 `Hello.class` 文件是完全相同的,无需修改。 --- ### 🧠 Java 跨平台的关键点总结 | 组件 | 作用 | |------|------| | **Java 编译器(javac)** | 将 Java 源码编译为平台无关的字节码 | | **字节码(.class)** | 一种中间语言,JVM 可以识别并执行 | | **JVM(Java Virtual Machine)** | 平台相关的虚拟机,负责加载并运行字节码 | | **Java 运行时环境(JRE)** | 包含 JVM 和核心类库,支持 Java 程序运行 | | **Java 标准库(Java API)** | 提供统一的接口,屏蔽底层差异 | --- ### 💡 为什么 C/C++ 不是跨平台的? - C/C++ 编译后直接生成的是**平台相关的机器码**。 - 同一份代码在不同平台需要重新编译,甚至修改部分代码(如系统调用、头文件路径等)。 --- ### ✅ 总结 Java 实现跨平台的核心在于: > **“编译一次的字节码 + 各平台专属的 JVM”** ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值