跳到主要内容

JVM 知识体系概览

什么是 JVM?

JVM(Java Virtual Machine,Java 虚拟机) 是 Java 程序的运行环境——它不是一台真正的物理机器,而是一个运行在操作系统之上的软件虚拟计算机。Java 代码编译后生成的字节码(.class 文件),就运行在 JVM 上。

JVM 做了三件核心的事情:

  1. 加载字节码——通过类加载器(ClassLoader)将 .class 文件加载到内存
  2. 解释/编译执行——将字节码转换为机器指令运行(JIT 编译器会将热点代码编译为本地代码提升性能)
  3. 自动内存管理——通过垃圾回收器(GC)自动释放不再使用的对象内存
为什么前端面试不考 JVM,但 Java 面试必考?

JVM 相当于 Java 的"浏览器"——理解 JVM 就像前端理解浏览器渲染原理和 V8 引擎一样重要。线上 OOM(内存溢出)、频繁 GC 导致卡顿、类加载冲突等问题,都需要 JVM 知识来排查。


JVM 运行时内存结构

区域线程存储内容异常
程序计数器私有当前线程执行的字节码行号不会 OOM
虚拟机栈私有每个方法的栈帧(局部变量、操作数栈)StackOverflowError
本地方法栈私有Native 方法调用StackOverflowError
共享所有对象实例OutOfMemoryError
方法区/元空间共享类信息、常量、静态变量OutOfMemoryError

堆(Heap) 是 JVM 中最大的一块内存区域,几乎所有对象都在堆上分配。堆又分为新生代(Young Generation)和老年代(Old Generation),新创建的对象先放新生代,经过多次 GC 仍存活的对象晋升到老年代。


核心知识点

垃圾回收(GC)——自动的"内存清洁工"

Java 不需要手动 free() 释放内存,JVM 通过垃圾回收器(Garbage Collector) 自动回收不再使用的对象。

如何判断对象"已死"?

  • 引用计数法:给对象加计数器,有引用 +1,引用失效 -1,为 0 则回收。缺点:无法解决循环引用
  • 可达性分析(Java 采用):从 GC Roots(栈中引用、静态变量、常量等)出发,能到达的对象是存活的,不可达的就是垃圾

GC 算法

算法原理优缺点
标记-清除标记存活对象,清除未标记的简单但会产生内存碎片
标记-复制将存活对象复制到另一半空间无碎片但浪费一半空间(新生代用)
标记-整理将存活对象移到一端,清除边界外的无碎片但移动成本高(老年代用)

主流垃圾收集器

收集器算法特点适用场景
Serial复制/整理单线程,STW客户端/小内存
Parallel复制/整理多线程,追求吞吐量后台任务
CMS标记-清除并发标记,低停顿Web 应用(已废弃)
G1分区收集可控停顿时间大内存,JDK 9+ 默认
ZGC染色指针停顿 < 10ms超大内存,低延迟

类加载机制——.class 文件如何变成可执行的类

类加载分为五个阶段:加载 → 验证 → 准备 → 解析 → 初始化

双亲委派模型是类加载的核心机制——当一个类加载器收到加载请求时,它不会自己去加载,而是先委托给父加载器,父加载器也向上委托,直到顶层的 Bootstrap ClassLoader。只有父加载器找不到时,子加载器才自己加载。

这样做的好处是保证核心类库的唯一性——无论谁加载 java.lang.String,最终都是由 Bootstrap ClassLoader 加载,防止有人自定义一个 String 类替换掉系统的。

JVM 调优——让 Java 应用"跑得更快"

JVM 调优的核心是通过调整 JVM 参数优化内存分配和 GC 行为:

# 常见 JVM 参数
-Xms512m # 堆最小内存
-Xmx2g # 堆最大内存
-Xmn512m # 新生代大小
-XX:+UseG1GC # 使用 G1 收集器
-XX:MaxGCPauseMillis=200 # 目标最大 GC 停顿

OOM 排查——线上最常见的"事故"

OutOfMemoryError 是线上最常见的 JVM 故障。常见类型:

  • Java heap space:堆内存不足(大对象、内存泄漏)
  • Metaspace:元空间不足(动态生成大量类)
  • Unable to create new native thread:线程数超限

排查工具:jps(查进程)→ jmap -dump(导出堆转储)→ MAT(Eclipse Memory Analyzer Tool)分析。


学习建议

推荐学习路径
  1. 内存结构 → 理解 JVM 各区域的作用
  2. 垃圾回收 → GC 算法 + 收集器对比
  3. 类加载 → 双亲委派 + 打破双亲委派
  4. JVM 调优 → 参数配置 + GC 日志分析
  5. OOM 排查 → 线上故障排查实战

相关链接