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)

  1. 加载:查找并加载.class文件
  2. 链接:验证、准备和解析(可选)
  3. 初始化:执行类构造器<clinit>()方法

运行时数据区(Runtime Data Areas)

  1. 方法区(Method Area):存储类结构、常量、静态变量等
  2. 堆(Heap):对象实例和数组的存储区域
  3. Java栈(Java Stacks):线程私有,存储栈帧
  4. 程序计数器(PC Registers):线程私有,指示当前执行位置
  5. 本地方法栈(Native Method Stacks):用于本地方法调用

执行引擎(Execution Engine)

  1. 解释器:解释执行字节码
  2. JIT编译器:将热点代码编译为本地机器码
  3. 垃圾回收器:自动内存管理

本地方法接口(JNI)

提供与本地库(C/C++)交互的能力


JVM的工作流程

  1. Java源代码(.java)通过javac编译为字节码(.class)
  2. 类加载器加载字节码到JVM
  3. 字节码被解释执行或通过JIT编译为本地代码执行
  4. 执行过程中使用运行时数据区存储数据
  5. 垃圾回收器自动回收不再使用的对象

内存模型与垃圾回收

堆内存结构

  1. **新生代(Young Generation):**Eden区、Survivor区(S0和S1)
  2. 老年代(Old Generation)
  3. 永久代/元空间(PermGen/Metaspace) (Java 8后用元空间替代永久代)

垃圾回收算法

  1. 标记-清除(Mark-Sweep)
  2. 标记-整理(Mark-Compact)
  3. 复制算法(Copying)
  4. 分代收集(Generational Collection)

常见垃圾回收器

  1. Serial GC
  2. Parallel GC
  3. CMS (Concurrent Mark-Sweep)
  4. G1 (Garbage-First)
  5. ZGC (Z Garbage Collector)
  6. Shenandoah

JVM优化与调优

常见调优参数

  1. -Xms:初始堆大小-Xmx:最大堆大小
  2. -Xmn:新生代大小
  3. -XX:NewRatio:新生代与老年代比例
  4. -XX:SurvivorRatio:Eden与Survivor区比例
  5. -XX:MaxMetaspaceSize:元空间最大值

性能监控工具

  1. jps:JVM进程状态工具
  2. jstat:JVM统计监控工具
  3. jmap:内存映射工具
  4. jstack:堆栈跟踪工具
  5. VisualVM:图形化监控工具
  6. JConsole:Java监控与管理控制台

JVM版本差异

  1. Java 7:引入G1垃圾回收器(实验性)
  2. Java 8:永久代被元空间取代
  3. Java 9:默认G1回收器,引入模块系统
  4. Java 11:引入ZGC(实验性)
  5. Java 15:ZGC和Shenandoah成为正式功能

JVM是Java生态系统的基石,理解其工作原理对于编写高效、稳定的Java应用程序至关重要。