一、到底什么是 JVM?一句话讲透
JVM 全称 Java 虚拟机,简单理解:一台专门用来运行 Java 程序的虚拟电脑。
我们写的 Java 代码,电脑本身是看不懂的,真正执行代码的不是操作系统,而是 JVM。
同时它也是 Java跨平台的核心:
Windows 有 Windows 版 JVM
Linux 有 Linux 版 JVM
Mac 有 Mac 版 JVM
代码只需要写一次,编译成统一的.class字节码文件,就能在任意装有 JVM 的系统上运行。
一次编写,到处运行,靠的就是 JVM。
二、JVM 整体架构:三大核心模块(全局框架)
整个 JVM 内部结构非常规整,宏观上就分为三大模块。
Java 程序从启动、加载、运行、内存分配、垃圾回收,全部都在这三大模块中完成。
完整运行链路记住一句话:类加载子系统 → 运行时数据区(内存) → 执行引擎
下面逐个通俗讲解,只讲作用,不讲细节。
2.1 类加载子系统:程序的“搬运工”
我们写的 Java 代码,编译后会生成.class字节码文件,存放在硬盘上。
硬盘上的文件无法直接运行,必须加载到内存。
类加载子系统的唯一作用:把硬盘的 class 文件,安全搬运、加载到 JVM 内存中。
它会简单做三件事:
加载:读取 class 文件进内存
校验:检查文件格式是否合法、安全
初始化:给类的静态变量、默认数据完成初始化
你不用记双亲委派、不用记加载细节,入门只需要知道:所有代码想运行,必须先经过类加载器加载。
2.2 运行时数据区:JVM 的“内存仓库”
这是 JVM 最核心的区域,也是大家口中常说的JVM 内存模型。
可以通俗理解为:JVM 专门划分出来的几块独立内存空间,用来存放代码、对象、变量、线程信息。
总共分为 5 个区域,我只讲各自用途,不深挖底层:
1. 程序计数器
记录当前线程代码执行到第几行,线程私有,空间极小,不会内存溢出。
2. 虚拟机栈
每个线程独占一份,存放方法执行信息、局部变量。方法调用、入栈出栈都在这里。
栈深度过大会报栈溢出错误StackOverflowError。
3. 本地方法栈
专门给 Java 调用系统底层native本地方法使用,日常开发几乎感知不到。
4. 堆内存(最重要)
整个 JVM 最核心的区域。
所有new 出来的对象、数组全部存在堆里,全局线程共享。
我们常说的GC 垃圾回收,主要回收的就是堆内存。
5. 方法区(JDK8+ 元空间)
存放类结构信息、静态变量、常量、方法元数据等全局固定信息。
JDK8 之后彻底废弃永久代,使用元空间 Metaspace。
2.3 执行引擎:真正干活的“执行者”
代码加载进内存之后,谁来运行?答案就是:执行引擎。
它是 JVM 的“CPU”,负责真正执行字节码,主要包含三部分能力:
1. 解释器
逐行解释执行字节码,启动快,适合短时执行代码。
2. JIT 即时编译器
针对频繁执行的热点代码,编译成机器码缓存,大幅提速,是 Java 越跑越快的核心。
3. GC 垃圾回收器
自动清理堆内存中无效、不再使用的对象,释放内存,防止程序内存溢出。
三、全局串联:一段代码的完整运行流程
我帮大家把整个 JVM 流程完整串起来,看完彻底通透:
我们写的
.java源代码,编译为.class字节码文件类加载子系统将 class 文件加载进 JVM 内存
数据、对象、方法信息,分别存入运行时数据区的各个内存区域
执行引擎解释/编译字节码,执行程序逻辑
程序运行中,GC 自动清理无效对象,回收内存
程序结束,JVM 释放所有资源
加载 → 存内存 → 执行 → 自动回收,这就是 JVM 的全部工作。
四、新手必背:JVM 核心框架总结(极简版)
不用记复杂知识点,入门只需要记住这 5 句话:
JVM 是 Java 专属虚拟机,是 Java 跨平台的核心
类加载子系统:负责把代码加载进内存
运行时数据区:JVM 所有内存的分配区域,对象存在堆里
执行引擎:负责跑代码、热点提速、垃圾回收
GC 主要作用于堆内存,自动帮我们释放无用内存