【JAVA八股文第一章-JVM内存模型】

JVM 内存模型详解(从入门到理解执行原理)

一、什么是 JVM 内存模型?

JVM(Java Virtual Machine)内存模型,本质上就是:

Java 程序在运行时,数据在内存中的划分方式以及各部分的作用机制

理解 JVM 内存模型,是学习 Java 高级内容(如 GC、性能调优、并发)的基础。


二、JVM 内存整体结构

JVM 运行时内存分为两大类:

✅ 1. 线程私有(每个线程独有)

  • 程序计数器(PC Register)
  • 虚拟机栈(Stack)
  • 本地方法栈(Native Stack)

✅ 2. 线程共享(所有线程共享)

  • 堆(Heap)
  • 方法区(Method Area)

三、线程私有区域详解

1️⃣ 程序计数器(PC Register)

作用:

记录当前线程执行到哪一条字节码指令

特点:

  • 每个线程独立
  • 用于线程切换恢复执行位置
  • 不会发生内存溢出(OOM)

2️⃣ 虚拟机栈(Stack)

核心作用:

管理方法的调用和执行过程

方法执行流程:
text 复制代码
方法调用 → 创建栈帧 → 入栈
方法结束 → 栈帧出栈

⭐ 栈帧结构(重点)

每个方法对应一个栈帧,包含:

✔ 局部变量表(Local Variables)
  • 存储:基本类型的值 / 对象引用
  • 使用 slot(槽位)管理
  • ❗ 不存变量名

✔ 操作数栈(Operand Stack)
  • 用于计算(+、-、*、/)
  • JVM 是"基于栈的计算模型"

示例:

java 复制代码
int c = a + b;

底层类似:

text 复制代码
load a
load b
add
store c

✔ 动态链接(Dynamic Linking)
  • 将方法调用与方法区中的方法关联

✔ 方法返回地址(Return Address)
  • 方法执行结束后,返回到调用位置

⚠️ 栈相关异常

  • StackOverflowError(递归过深)
  • OutOfMemoryError(栈扩展失败)

3️⃣ 本地方法栈(Native Stack)

作用:

为 native 方法(C/C++)服务

例如:

java 复制代码
System.currentTimeMillis();

底层由本地方法实现。


四、线程共享区域详解


4️⃣ 堆(Heap)⭐最重要

核心作用:

存放对象实例

特点:

  • JVM 中最大的一块内存
  • 所有线程共享
  • 垃圾回收(GC)主要发生在这里

✔ 堆的结构(分代模型)

text 复制代码
新生代(Young Generation)
    Eden
    Survivor(S0 / S1)

老年代(Old Generation)

✔ 对象生命周期

text 复制代码
new → Eden
存活 → Survivor
多次存活 → 老年代

⚠️ 常见异常

text 复制代码
java.lang.OutOfMemoryError: Java heap space

5️⃣ 方法区(Method Area)

核心作用:

存储类的信息和方法代码


✔ 存储内容:

  • 类结构信息
  • 方法字节码
  • 常量池
  • 静态变量

✔ JDK 8 之后

方法区实现为:

Metaspace(元空间)

特点:

  • 使用本地内存
  • 不在堆中

五、执行流程详解(重点)

来看一段代码:

java 复制代码
public static void main(String[] args) {
    int a = 10;
    Person p = new Person();
}

执行过程:

① 类加载
text 复制代码
Person.class → 方法区

② main 方法入栈
text 复制代码
栈中创建 main 栈帧

③ 执行 int a = 10
text 复制代码
局部变量表:
slot[0] = 10

④ 执行 new Person()
text 复制代码
堆:
创建 Person 对象

栈:
p = 对象地址(引用)

⑤ 程序计数器
text 复制代码
始终记录当前执行位置

六、核心关系总结(必须掌握)

text 复制代码
栈(局部变量) → 指向 → 堆(对象)
方法区 → 定义类和方法

七、面试高频问题总结

✔ 对象存在哪?

👉 堆


✔ 引用存在哪?

👉 栈(局部变量表)


✔ 方法在哪?

👉 方法区


✔ 方法如何执行?

👉 通过栈(栈帧)


✔ 为什么会 OOM?

👉 堆 或 方法区内存不足


八、终极总结

text 复制代码
方法区:定义(类、方法)
堆:数据(对象)
栈:执行(方法运行过程)

九、结语

JVM 内存模型是理解 Java 底层机制的关键基础:

  • 想学 GC → 必须懂堆
  • 想学并发 → 必须懂内存结构
  • 想调优 → 必须懂整个运行模型