⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 小哈学Java 「犬小哈」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

面试官真正想听什么

别以为贴个”编译型”或”解释型”标签就过关了。面试官想确认你理解 Java 从源码到执行的完整链路:

  1. .java 怎么变成机器指令?
  2. 字节码和 JVM 各扮演什么角色?
  3. JIT 编译器的存在意味着什么?

答不上第三点,这题基本凉一半。

一句话结论:混合型,两头都沾

Java 既不是纯编译型,也不是纯解释型——它是混合型语言。

javac 先把 .java 编译成平台无关的字节码(.class),然后 JVM 在运行时通过解释执行 + JIT 即时编译的混合策略,将字节码转换为本地机器码。前半段像编译型,后半段像解释型,合在一起谁也不纯。

第一步:javac 把源码变成字节码

执行 javac Hello.java,编译器完成词法分析、语法分析、语义分析,输出字节码——一种不面向任何具体 CPU 的中间指令集。

这一步的意义是平台无关性:只要目标机器装了 JVM,这份字节码就能跑。但要注意,字节码不是机器码,CPU 看不懂它,必须再经过 JVM 翻译才能执行。

第二步:JVM 解释 + JIT 双引擎执行

执行 java Hello 启动 JVM 后,真正的执行才开始。JVM 有两种武器:

  • 解释器:逐条翻译字节码为机器码并执行。启动快,但重复执行同一段代码效率低——每次都得重新翻译,像是每次看英文文档都从头查词典。
  • JIT 即时编译器:JVM 统计方法调用次数,当”热点代码”超过阈值(-XX:CompileThreshold),JIT 介入,一次性编译成高度优化的本地机器码。此后直接跑机器码,性能飙升。

结论:前端编译产出字节码保跨平台,后端解释 + JIT 混合执行兼顾启动速度和峰值性能。

跟 C、Python 放一起比,一目了然

维度 C/C++(纯编译型) Python(纯解释型) Java(混合型)
编译产物 特定平台机器码 无(逐行解释) 平台无关字节码
执行方式 直接运行 解释器逐行翻译 解释 + JIT 动态编译
跨平台 不行,得重新编译 靠解释器本身 JVM 保证
峰值性能 极高 较低 接近 C(JIT 优化后)
启动速度 快 快 较慢(需预热)

Java 的设计哲学:用”中间产物 + 动态编译”同时拿到跨平台和高性能。 这个思路在当年相当前卫,现在已经成了语言设计的主流范式——C#、Kotlin 都走了类似的路。

JIT 之后还有故事:预热、分层、AOT

  • 预热(Warm-up):微服务刚启动时性能差,因为热点代码还没被 JIT 编译。在流量接入前先调几轮核心接口,让 JIT 提前介入,高峰期才能打满性能。
  • 分层编译(Tiered Compilation):JDK 7 引入。C1 快速编译保启动速度,C2 深度优化拉峰值性能。两级联动,鱼和熊掌兼得。
  • AOT 编译:JDK 9 开始引入,把字节码提前编译为机器码,缩短启动时间。GraalVM Native Image 就是这条路线的代表。但在反射和动态代理多的场景仍有局限。

三个答错就扣分的误区

  1. “Java 是编译型,因为要用 javac”——只对了一半。javac 编译的目标是字节码,不是机器码。真正的执行还得靠 JVM。
  2. “Java 是解释型,因为跑在虚拟机上”——同样片面。JIT 会把热点代码编译成本地机器码,性能特征已经非常接近编译型语言。
  3. 把字节码当机器码——字节码是 JVM 指令集,必须经过 JVM 转化才能被 CPU 执行,两者不是一回事。搞混这个,说明你对执行链路的理解还有盲区。
文章目录
  1. 1. 面试官真正想听什么
  2. 2. 一句话结论:混合型,两头都沾
  3. 3. 第一步:javac 把源码变成字节码
  4. 4. 第二步:JVM 解释 + JIT 双引擎执行
  5. 5. 跟 C、Python 放一起比,一目了然
  6. 6. JIT 之后还有故事:预热、分层、AOT
  7. 7. 三个答错就扣分的误区