【JVM】编译&&解释

可以把这部分理解成一句话:

Java 不是单纯的编译型语言,也不是单纯的解释型语言,而是"先编译,再解释,运行中再可能即时编译"的混合型语言。


1. 什么是编译?

编译就是:在程序运行之前,先把源代码整体翻译成机器能直接执行的代码。

比如 C 语言:

c 复制代码
hello.c  →  编译器编译  →  hello.exe

生成的 hello.exe 就是机器码文件,操作系统可以直接运行。

所以 C 语言通常叫 编译型语言

特点是:

text 复制代码
源代码 → 机器码 → 直接运行

2. 什么是解释?

解释就是:程序运行时,解释器一边读代码,一边翻译,一边执行。

比如 JavaScript、Python 的常见执行方式:

text 复制代码
源代码 → 解释器逐行解释 → 执行

它通常不会提前生成一个真正的机器码可执行文件。

所以解释型语言的特点是:

text 复制代码
边翻译,边执行

3. Java 为什么特殊?

Java 的执行过程不是简单的一步。

它大概分成三步:

text 复制代码
Java 源代码
   ↓ javac 编译
字节码 .class 文件
   ↓ JVM 解释执行
机器执行

比如:

java 复制代码
Hello.java

先通过 javac 编译成:

text 复制代码
Hello.class

但是注意:

.class 文件不是机器码,而是字节码。

机器不能直接执行字节码,必须交给 JVM


4. 字节码是什么?

字节码可以理解成一种 中间代码

它既不是 Java 源代码,也不是最终的机器码。

text 复制代码
Java 源代码:人能看懂
字节码:JVM 能看懂
机器码:CPU 能看懂

Java 这样设计,是为了跨平台。

比如同一份 .class 文件:

text 复制代码
Windows 上的 JVM 可以执行
Linux 上的 JVM 可以执行
Mac 上的 JVM 也可以执行

也就是常说的:

text 复制代码
一次编译,到处运行

准确点说是:

text 复制代码
一次编译成字节码,只要有对应平台的 JVM,就可以运行

5. JVM 怎么执行字节码?

JVM 执行字节码主要有两种方式:

第一种:解释执行

JVM 的解释器一条一条读取字节码,然后翻译成机器指令执行。

类似:

text 复制代码
字节码 → JVM解释器 → 机器码 → CPU执行

这种方式启动快,但是如果某段代码反复执行,每次都解释就比较浪费。


第二种:JIT 即时编译

JVM 在运行过程中会观察代码。

如果发现某个方法或者循环执行得特别频繁,就会认为它是 热点代码

比如:

java 复制代码
for (int i = 0; i < 1000000; i++) {
    sum += i;
}

这种循环执行次数很多,JVM 就可能觉得:

text 复制代码
这段代码太常用了,别每次解释了,直接编译成机器码吧。

于是 JIT 编译器会把这段热点字节码编译成机器码。

之后再执行这段代码时,就可以直接执行机器码了,速度更快。

流程是:

text 复制代码
热点字节码 → JIT编译器 → 机器码 → 直接执行

6. 所以 Java 到底是编译型还是解释型?

严格来说:

Java 同时包含编译和解释。

因为它先有一次编译:

text 复制代码
.java → .class

这是编译。

然后运行时 JVM 解释执行字节码:

text 复制代码
.class → JVM解释执行

这是解释。

运行过程中,热点代码还会被 JIT 编译成机器码:

text 复制代码
热点字节码 → 机器码

这又是编译。

所以 Java 的完整过程可以理解为:

text 复制代码
.java 源文件
   ↓ javac 编译
.class 字节码
   ↓ JVM 解释执行
机器执行

运行过程中:
热点代码
   ↓ JIT 即时编译
机器码
   ↓ 直接执行

7. AOT 又是什么?

AOT 是 Ahead Of Time,提前编译。

它和 JIT 不一样。

JIT 是:

text 复制代码
运行时发现热点代码,再编译成机器码

AOT 是:

text 复制代码
程序运行前,就提前编译成机器码

所以 AOT 更接近传统编译型语言。

比如:

text 复制代码
Java代码/字节码 → AOT编译 → 本地机器码

这样程序启动可能更快,因为不需要运行时再慢慢解释和 JIT 优化。


8. 面试可以怎么说?

可以这样回答:

Java 不能简单地说是编译型语言或者解释型语言,它是编译和解释并存的语言。Java 源代码会先通过 javac 编译成字节码文件,也就是 .class 文件,这一步属于编译。但字节码不是机器码,不能被 CPU 直接执行,需要交给 JVM 解释执行。在程序运行过程中,如果 JVM 发现某些方法或代码块执行得很频繁,就会通过 JIT 即时编译器把这些热点代码编译成本地机器码,提高执行效率。所以 Java 是一种既有编译过程,也有解释执行,同时还支持 JIT 优化的语言。

再简短一点:

Java 是半编译半解释型语言。先通过 javac 编译成字节码,再由 JVM 解释执行;运行过程中热点代码会被 JIT 编译成机器码直接执行,所以 Java 既有编译,也有解释。

相关推荐
行者-全栈开发18 小时前
美团后端开发面试题全集(2026最新版):HashMap、JVM、MySQL、Redis高频考点深度解析
jvm·hashmap·java面试题·后端开发·redis缓存·mysql索引·面经汇总
豆沙沙包?20 小时前
C++-程序的内存模型(P84-P88)
java·jvm·c++
未秃头的程序猿21 小时前
凌晨3点被叫醒:线上OOM,我用这套流程40分钟定位根因
java·jvm·后端
执笔画流年呀1 天前
JVM虚拟机
jvm
lisin-lee-cooper1 天前
JVM知识体系
java·jvm
zzz_23682 天前
TencentDB-Agent-Memory 深度解析:让多个 Agent 共享项目经验的记忆中枢
java·开发语言·jvm·人工智能·agent·memory·tencent db
阿宇的技术日志2 天前
堆溢出解决思路
jvm
番茄炒鸡蛋加糖2 天前
JVM基础1:内存区域、GC垃圾回收算法
大数据·jvm·算法
bbq粉刷匠2 天前
ArrayList 整体认识
java·jvm·数据结构
math_hongfan2 天前
鸿蒙存储碎片高级清理机制:数据库Vacuum/文件碎片整理/缓存过期清理/主动空间回收策略
jvm·数据库·学习·缓存·华为·harmonyos·鸿蒙