JVM内存模型核心依据是线程是否共享数据:线程私有区域(程序计数器、虚拟机栈、本地方法栈)随线程生死,互不干扰;线程共享区域(堆、方法区/元空间)全局可见,是GC与OOM主要发生地。

JVM内存模型的核心划分依据是线程是否共享数据。这种划分直接决定了内存的生命周期、线程安全性以及异常触发条件。
线程私有区域:随线程而生,随线程而灭
这类区域每个线程独有一份,互不干扰,无需同步控制。
- 程序计数器:记录当前线程正在执行的字节码指令地址,是唯一不会抛出OutOfMemoryError的区域;执行Native方法时值为undefined。
- 虚拟机栈:方法调用时创建栈帧,存放局部变量表、操作数栈等;栈深度超限抛StackOverflowError,栈扩展失败则抛OutOfMemoryError。
- 本地方法栈:专为Native方法服务,结构与虚拟机栈类似;HotSpot中常与虚拟机栈合二为一。
线程共享区域:全局可见,GC重点管理对象
所有线程共用同一块内存,需关注并发安全与内存回收策略。
- Java堆:对象实例和数组的唯一分配地,GC主要区域;分为新生代(Eden + S0/S1)和老年代;堆空间不足时抛OutOfMemoryError: Java heap space。
- 方法区(JDK8+为元空间):存储类信息、常量池、静态变量、JIT编译代码;使用本地内存,不再受-XX:MaxPermSize限制;加载过多类或元数据时可能OOM。
关键对比要点
程序计数器最小却最关键,保障多线程切换后能准确恢复执行位置;虚拟机栈体现方法调用逻辑,栈帧结构决定局部变量生命周期;堆是应用内存消耗主体,调优重点;元空间取代永久代后,类元数据管理更灵活,但监控仍不可少。

















