JVM通关指南(一)原来这就是JVM
Hi,JVM的通关指南系列文章可以让大家从0-1认识JVM,从字节码的隐秘舞步,到垃圾回收的时空艺术,从类加载的双亲委派玄机,到JIT编译器的性能黑科技,我们一起穿透JVM的迷雾。
本文章将对JVM的内容做一个概述,后续会分别详细分析各知识模块(运行时数据区、内存结构、垃圾回收机制、垃圾收集器、参数配置、JVM可视化工具等)。
JVM
JVM:Java Virtual Machine,是Java程序的核心运行环境,主要工作是解释字节码并映射到本地的CPU指令集和OS系统调用,JVM屏蔽了与操作系统平台的相关信息,使Java程序无需进行修改就可以在多种不同平台上运行,即”一次编译,到处运行“。
JDK、JRE 和 JVM的区别
JVM:执行编译后的 Java 字节码(.class
文件),实现跨平台特性,一次编写,到处运行。
JRE:为运行 Java 程序提供必要环境(包含 JVM + 基础类库)
JDK:提供完整的 Java 开发环境(包含 JRE + 开发工具)
包含关系:JDK ⊃ JRE ⊃ JVM
三者的类比说明
JVM 像汽车的发动机(负责执行)
JRE 是发动机 + 油箱、轮胎等(确保能开动)
JDK 是整个汽车工厂(能造车 + 开车)

JVM的架构
JVM主要由以下子系统组成:
类加载器子系统(Class Loader Subsystem)
- 加载:查找并加载.class文件
- 链接:验证、准备和解析(可选)
- 初始化:执行类构造器
<clinit>()
方法
运行时数据区(Runtime Data Areas)
- 方法区(Method Area):存储类结构、常量、静态变量等
- 堆(Heap):对象实例和数组的存储区域
- Java栈(Java Stacks):线程私有,存储栈帧
- 程序计数器(PC Registers):线程私有,指示当前执行位置
- 本地方法栈(Native Method Stacks):用于本地方法调用
执行引擎(Execution Engine)
- 解释器:解释执行字节码
- JIT编译器:将热点代码编译为本地机器码
- 垃圾回收器:自动内存管理
本地方法接口(JNI)
提供与本地库(C/C++)交互的能力
JVM的工作流程
- Java源代码(.java)通过javac编译为字节码(.class)
- 类加载器加载字节码到JVM
- 字节码被解释执行或通过JIT编译为本地代码执行
- 执行过程中使用运行时数据区存储数据
- 垃圾回收器自动回收不再使用的对象
内存模型与垃圾回收
堆内存结构
- **新生代(Young Generation):**Eden区、Survivor区(S0和S1)
- 老年代(Old Generation)
- 永久代/元空间(PermGen/Metaspace) (Java 8后用元空间替代永久代)
垃圾回收算法
- 标记-清除(Mark-Sweep)
- 标记-整理(Mark-Compact)
- 复制算法(Copying)
- 分代收集(Generational Collection)
常见垃圾回收器
- Serial GC
- Parallel GC
- CMS (Concurrent Mark-Sweep)
- G1 (Garbage-First)
- ZGC (Z Garbage Collector)
- Shenandoah
JVM优化与调优
常见调优参数
-Xms
:初始堆大小-Xmx
:最大堆大小-Xmn
:新生代大小-XX:NewRatio
:新生代与老年代比例-XX:SurvivorRatio
:Eden与Survivor区比例-XX:MaxMetaspaceSize
:元空间最大值
性能监控工具
- jps:JVM进程状态工具
- jstat:JVM统计监控工具
- jmap:内存映射工具
- jstack:堆栈跟踪工具
- VisualVM:图形化监控工具
- JConsole:Java监控与管理控制台
JVM版本差异
- Java 7:引入G1垃圾回收器(实验性)
- Java 8:永久代被元空间取代
- Java 9:默认G1回收器,引入模块系统
- Java 11:引入ZGC(实验性)
- Java 15:ZGC和Shenandoah成为正式功能
JVM是Java生态系统的基石,理解其工作原理对于编写高效、稳定的Java应用程序至关重要。