从 Java 到 Kotlin:全面理解现代 JVM 语言生态
如果你准备成为 Java/Kotlin/KMP 开发工程师,那么理解 JVM 比学习某一门语言更重要。
很多初学者认为:
Java = JVM
其实这是错误的。
真正的关系应该是:
Java │ │ Kotlin ───── JVM ───── Scala │ Groovy │ ClojureJVM 才是真正的核心。
Java 只是第一门运行在 JVM 上的语言。
一、什么是 JVM?
JVM(Java Virtual Machine)
中文:
Java 虚拟机
很多人看到"虚拟机"三个字,就想到 VMware、VirtualBox。
其实完全不是一个东西。
VMware 是:
Windows ↓ VMware ↓ Ubuntu它模拟了一台计算机。
而 JVM 是:
Windows Linux macOS ↓ JVM ↓ Java程序它不是模拟计算机。
而是:
模拟 Java 程序运行环境。
JVM 到底干什么?
假设写一个 Java 程序:
public class Main { public static void main(String[] args) { System.out.println("Hello"); } }执行过程:
Java源码 │ javac 编译 │ Main.class │ JVM加载 │ CPU执行注意:
CPU 根本不认识 Java。
CPU 认识的是:
010101010101机器指令。
所以:
JVM 的职责就是:
Java ↓ Bytecode ↓ 机器码 ↓ CPU二、为什么 Java 能跨平台?
这是 Java 最伟大的设计。
看看 C++:
Windows:
C++ ↓ Windows.exeLinux:
C++ ↓ Linux ELF必须重新编译。
而 Java:
Java ↓ Main.class ↓ Windows JVMLinux:
Java ↓ Main.class ↓ Linux JVMmac:
Java ↓ Main.class ↓ mac JVM所以:
Java 编译一次即可。
真正变化的是:
不同平台的 JVM。这就是:
Write Once Run Anywhere
三、什么叫 Bytecode(字节码)?
很多人不知道:
Java 编译以后:
不是机器码。
而是:
.class里面保存的是:
Bytecode例如:
Java:
int a = 1; int b = 2; System.out.println(a+b);反编译以后:
iconst_1 istore_1 iconst_2 istore_2 iadd invokevirtual这些:
CPU 根本不认识。
JVM 认识。
所以:
Java ↓ Bytecode ↓ JVM解释 ↓ 机器码四、JVM 为什么这么快?
很多人觉得:
虚拟机一定慢。
实际上:
现代 JVM 非常快。
原因就是:
JIT
Just In Time Compiler
第一次执行:
Java ↓ 解释执行第二次:
JVM发现:
这个方法调用了10000次。于是:
Bytecode ↓ 直接编译成机器码 ↓ 缓存起来以后:
直接运行。
不用解释。
所以:
Java 很多时候:
性能接近 C++。
五、既然 JVM 这么厉害……
大家开始想:
为什么只有 Java 能运行?
于是:
各种语言开始:
自己的语法 ↓ 编译成.class ↓ JVM所以:
JVM 不属于 Java。
Java 属于 JVM。
六、现代 JVM 语言的发展历史
第一代
只有:
Java时间:
1995
作者:
James Gosling。
目标:
替代 C++。
第二代
大家开始开发:
Groovy Scala希望:
比 Java 更简洁。
但是:
Java 当时仍然:
public static void main getter setter new 泛型写起来很长。
第三代
Google:
推出 Android。
Java:
开始暴露一些问题。
Google:
希望:
更少代码 更安全 空指针更少于是:
Kotlin 出现。
2017:
Google:
宣布:
Kotlin First
之后:
Android 基本全部推荐 Kotlin。
七、现代 JVM 语言有哪些?
Java
定位:
企业级开发。
特点:
成熟 稳定 工作最多典型:
Spring Boot。
Kotlin
定位:
现代 JVM。
特点:
Null Safety Coroutine DSL Extension Function Data Class几乎:
每一项:
都是 Java 后来才补上的。
Scala
定位:
函数式。
最有名:
Spark。
几乎:
所有大数据:
Spark Akka Play都是 Scala。
Groovy
定位:
脚本。
例如:
Jenkins Pipeline:
pipeline { }CI/CD 必学。
Clojure
定位:
Lisp。
函数式。
Immutable。
国内很少。
国外不少创业公司喜欢。
八、为什么 Kotlin 会成功?
其实:
Java 最大问题:
不是性能。
而是:
代码太长。
例如:
Java:
public class User { private String name; public User(String name){ this.name=name; } }Kotlin:
data class User( val name:String )一句。
结束。
Null Safety
Java:
String name = null; name.length();运行:
NullPointerExceptionKotlin:
var name:String?=null编译器:
直接报错。
因此:
大量减少:
线上 Bug。
Extension Function
Java:
不能:
给 String 增加方法。
Kotlin:
fun String.hello(){ }以后:
"abc".hello()直接能用。
非常优雅。
Coroutine
Java:
线程:
Thread Future CompletableFuture越来越复杂。
Kotlin:
launch{ }即可。
九、现代 JVM 技术栈
现在企业真正开发:
已经不是:
Java。
而是:
Java + Spring + MySQL + Redis + MQ + Docker + Kubernetes + JVM如果 Android:
Kotlin + Compose + Coroutine + Flow + KMP如果:
大数据:
Scala + Spark + Kafka + Flink十、JVM 的核心组成
很多人学 Java 很久,都不知道 JVM 内部长什么样。
实际上,一个 Java 程序启动后,大致经历下面几个阶段:
Java Source (.java) │ javac 编译 │ Bytecode (.class) │ ClassLoader(类加载器) │ ┌───────────────┴───────────────┐ │ │ Runtime Data Area(运行时数据区) Execution Engine(执行引擎) │ │ 方法区、堆、Java 栈、本地方法栈、PC 解释器 + JIT 编译器 │ │ └───────────────┬───────────────┘ │ Garbage Collector(GC) │ CPU其中最重要的几个模块是:
1. ClassLoader(类加载器)
负责把.class文件加载到内存。
Java 的"热部署"、SPI、插件化等能力,都依赖类加载机制。
常见的类加载器有:
Bootstrap ClassLoader(启动类加载器)
Platform ClassLoader(平台类加载器)
Application ClassLoader(应用类加载器)
并遵循著名的双亲委派模型(Parent Delegation Model)。
2. Runtime Data Area(运行时数据区)
JVM 会把程序运行需要的数据放到不同区域。
主要包括:
Heap(堆):存放对象实例,是垃圾回收的主要区域。
Java Stack(虚拟机栈):每个线程私有,保存方法调用、局部变量等。
Method Area(方法区):保存类信息、常量池、静态变量等。
Program Counter(程序计数器):记录线程下一条执行指令的位置。
Native Method Stack(本地方法栈):执行 JNI 本地方法时使用。
3. Execution Engine(执行引擎)
负责真正执行字节码。
它包含:
Interpreter(解释器):逐条解释执行字节码,启动速度快。
JIT Compiler(即时编译器):把热点代码编译成本地机器码,提高运行效率。
这也是 Java 能兼顾跨平台和高性能的重要原因。
4. Garbage Collector(垃圾回收器)
Java 开发者通常不用手动释放内存,因为 JVM 会自动回收不再使用的对象。
常见 GC 包括:
Serial GC
Parallel GC
G1 GC(目前最常见)
ZGC(超低延迟)
Shenandoah(低停顿)
理解 GC 对排查内存泄漏、性能优化非常重要。
十一、为什么说 JVM 比语言更重要?
很多开发者会从 Java 转到 Kotlin,或者从 Kotlin 转到 Scala。
但他们几乎不用重新学习:
内存管理
垃圾回收
类加载
字节码
并发模型(部分)
JIT 编译
JVM 调优
因为这些能力都来自JVM,而不是具体的语言。
这也是为什么很多企业招聘写着:
Java/Kotlin 开发工程师(熟悉 JVM 原理)
真正考察的,往往不是语法,而是对 JVM 底层机制的理解。
十二、总结
现代 JVM 生态已经从"只有 Java"发展为一个庞大的平台:
JVM │ ┌───────────┬───────────┬───────────┐ │ │ │ │ Java Kotlin Scala Groovy │ │ │ │ Spring Boot Android Spark Jenkins │ │ │ │ └───────────┴───────────┴───────────┘ │ GC / JIT / 类加载 / 字节码 │ Windows · Linux · macOS · Server