1. JVM 到底是什么?为什么 Java 程序员都要学它?

🏭 类比——工厂:把 Java 程序想象成一家工厂:
JVM = 工厂本身(厂房、车间、仓库都是它提供的)
你的 Java 代码 = 工厂的生产流程
堆 = 原材料仓库(所有"对象"都放这里)
栈 = 操作台(方法调用时的临时工作区)
GC(垃圾回收) = 保洁员(自动清理没用的材料)
学 JVM = 搞懂"工厂的仓库怎么管、保洁员怎么工作、出了问题怎么排查"。

JVM(Java Virtual Machine,Java 虚拟机):运行 Java 程序的"环境"。你的代码不是直接被 CPU 执行,而是由 JVM 翻译执行(见入门模块"编译与解释")。

为什么要学它(面试理由):

🎯 先记住

  • JVM 是一个"进程",你的 Java 程序跑在它里面
  • jps 命令可以列出正在运行的 JVM 进程(java 程序)
  • JVM 管理内存:你只管 new 对象,不用管释放(GC 帮你)

2. JVM 内存分几块?(白话版,先懂再背)

JVM 把内存分成几块"区域",各干各的:

区域 白话解释 类比
堆(Heap)所有 new 出来的对象住这里——最大的区域,GC 的主战场大仓库
栈(Java 栈)每个方法调用占一格(栈帧),方法结束自动弹出操作台/收银台
方法区/元空间存放类的"说明书"(类名、方法、静态变量)员工手册柜
程序计数器记录当前执行到哪一行(线程私有)书签
本地方法栈给 native 方法(C 写的)用外包工位

一句话记忆:栈管运行(方法调用),堆管存储(对象)。

实际感受一下"栈"
public static void main(String[] args) {
    int a = 1;            // main 的栈帧里有个 a
    f();                   // 调用 f → 压一个新栈帧(叠加)
}                          // f 返回 → 栈帧弹出

public static void f() {
    int b = 2;            // f 的栈帧里有 b
}
// 递归无限调用 → 栈帧无限叠加 → StackOverflowError(栈溢出)

🎯 新手重点

  • 堆:对象住这里(GC 管);栈:方法调用临时区(自动清理)
  • OutOfMemoryError(堆满)= 仓库满了;StackOverflowError(栈满)= 递归太深
  • 堆可继续分:新生代(朝生夕死的对象)+ 老年代(长寿对象)——GC 页详解

3. 垃圾回收(GC)是什么?(白话版)

问题:new 了对象用完了,谁负责删?——GC 自动帮我们清理没用的对象,不用手动 free(不像 C)。

🧹 类比——保洁:
GC 怎么知道哪些对象没用?——看"还有人引用它吗":
对象就像会议室的资料:有人拿着(被引用)= 在用,不能收;没人拿了 = 垃圾,收走。
判断方法叫可达性分析:从几个"根"(GC Roots)出发,能走到的对象都活着,走不到的回收。

分代回收(核心思想):

🎯 先懂这三句

  • GC 自动回收"没人引用的对象"——你只管 new
  • 对象先在新生代,活久了进老年代
  • Full GC 会"暂停程序"(Stop The World)——频繁 Full GC 是性能杀手,调优目标就是减少它

4. JVM 的学习路径(从这篇开始)

  1. 本篇:建立"JVM 是什么"的直觉 ✅
  2. 内存模型:五大区域细节、对象创建过程、对象布局
  3. 类加载机制:类什么时候加载、双亲委派
  4. 垃圾回收:可达性分析、三大算法、CMS/G1/ZGC 收集器
  5. 字节码与调优:工具链(jps/jstat/jmap/jstack)+ 线上排查实战
  6. 配合实战:自己跑一个循环 new 的程序,用 jstat 观察内存变化

🎯 常见误区

  • 误区 1:"JVM = 内存"——错,内存只是 JVM 的一部分(还有类加载、执行引擎等)
  • 误区 2:"栈上存对象"——错,对象都在堆,栈上存的是引用(地址)
  • 误区 3:"GC 要手动调"——先懂原理再调参,90% 的调优是改代码不是改参数

🎤 常见面试追问

  1. JVM、JRE、JDK 的包含关系?(最基础送分题)——JDK ⊃ JRE ⊃ JVM。JVM 执行字节码;JRE = JVM + 核心类库;JDK = JRE + 开发工具(javac 等)。
  2. Java 为什么能"一次编译到处运行"?——编译产物是平台无关的字节码,不同系统装各自的 JVM 来执行——字节码一样,JVM 不同。
  3. 内存里的对象为什么"栈上只放引用"?——对象可能很大且存活期不定,放堆由 GC 统一管理;栈放"指向堆的地址"(引用),方法结束引用出栈即可。

📖 名词解释(本页术语)

术语 大白话解释
JVMJava 虚拟机:执行字节码的"运行时环境",管内存、管 GC、管线程。每个 Java 程序跑在一个 JVM 进程里。
JREJava 运行环境 = JVM + 核心类库。只运行程序(不开发)时够用。
JDKJava 开发工具包 = JRE + javac/java/javap 等工具。开发必须装它。
GC(垃圾回收)自动清理没用对象的机制——不用手动释放内存,GC 定期"保洁"。
新生代 / 老年代堆的分区:新生代放"刚出生"的对象(频繁回收);老年代放"活过多次 GC"的长寿对象(少回收)。
⚠️ 本页面由 AI 生成,内容仅供参考,请以官方文档和实际源码为准。