🚪 JVM 入门篇(零基础版)
看不懂 JVM 详解?先读这篇:JVM 是什么 · 内存怎么分 · 垃圾怎么回收——全部大白话
1. JVM 到底是什么?为什么 Java 程序员都要学它?
🏭 类比——工厂:把 Java 程序想象成一家工厂:
JVM = 工厂本身(厂房、车间、仓库都是它提供的)
你的 Java 代码 = 工厂的生产流程
堆 = 原材料仓库(所有"对象"都放这里)
栈 = 操作台(方法调用时的临时工作区)
GC(垃圾回收) = 保洁员(自动清理没用的材料)
学 JVM = 搞懂"工厂的仓库怎么管、保洁员怎么工作、出了问题怎么排查"。
JVM = 工厂本身(厂房、车间、仓库都是它提供的)
你的 Java 代码 = 工厂的生产流程
堆 = 原材料仓库(所有"对象"都放这里)
栈 = 操作台(方法调用时的临时工作区)
GC(垃圾回收) = 保洁员(自动清理没用的材料)
学 JVM = 搞懂"工厂的仓库怎么管、保洁员怎么工作、出了问题怎么排查"。
JVM(Java Virtual Machine,Java 虚拟机):运行 Java 程序的"环境"。你的代码不是直接被 CPU 执行,而是由 JVM 翻译执行(见入门模块"编译与解释")。
为什么要学它(面试理由):
- Java 程序的内存问题(内存溢出、性能慢)本质都是 JVM 问题
- 调优参数(-Xmx 等)是 JVM 的配置
- 面试高频:内存分区、垃圾回收、类加载——是"深入 Java"的分水岭
🎯 先记住
- 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 怎么知道哪些对象没用?——看"还有人引用它吗":
对象就像会议室的资料:有人拿着(被引用)= 在用,不能收;没人拿了 = 垃圾,收走。
判断方法叫可达性分析:从几个"根"(GC Roots)出发,能走到的对象都活着,走不到的回收。
分代回收(核心思想):
- 新生代:大部分对象"朝生夕死"(new 出来很快没用)——频繁清理,用复制算法(快)
- 老年代:活过多次清理的"老家伙"——少清理,用标记整理(不浪费空间)
- Minor GC:清理新生代(频繁、快);Full GC:全堆清理(少、慢、要停顿)
🎯 先懂这三句
- GC 自动回收"没人引用的对象"——你只管 new
- 对象先在新生代,活久了进老年代
- Full GC 会"暂停程序"(Stop The World)——频繁 Full GC 是性能杀手,调优目标就是减少它
4. JVM 的学习路径(从这篇开始)
- 本篇:建立"JVM 是什么"的直觉 ✅
- 内存模型:五大区域细节、对象创建过程、对象布局
- 类加载机制:类什么时候加载、双亲委派
- 垃圾回收:可达性分析、三大算法、CMS/G1/ZGC 收集器
- 字节码与调优:工具链(jps/jstat/jmap/jstack)+ 线上排查实战
- 配合实战:自己跑一个循环 new 的程序,用 jstat 观察内存变化
🎯 常见误区
- 误区 1:"JVM = 内存"——错,内存只是 JVM 的一部分(还有类加载、执行引擎等)
- 误区 2:"栈上存对象"——错,对象都在堆,栈上存的是引用(地址)
- 误区 3:"GC 要手动调"——先懂原理再调参,90% 的调优是改代码不是改参数