JVM内存结构核心按运行时数据用途和生命周期划分:堆为线程共享的对象公共仓库,栈为线程私有的方法执行工作台,方法区(元空间)为线程共享的类元数据档案室。

Java 中 JVM 内存结构的划分,核心是按**运行时数据的用途和生命周期**来组织的。堆、栈、方法区不是并列的三个独立部分,而是属于不同归属、承担不同职责的内存区域,且有明确的线程可见性区分。
堆(Heap)——所有对象的“公共仓库”
堆是 JVM 中最大、唯一被所有线程共享的运行时内存区域。
- 所有通过 new 创建的对象实例、数组,都分配在堆中;比如
User user = new User();,User对象本体在堆里,而变量user(只是个引用)存在栈中。 - 堆内部采用分代管理:分为新生代(Eden + Survivor From/To)和老年代。新生代放新创建、短期存活对象;经历多次 Minor GC 后仍存活的对象,会晋升到老年代。
- 它是垃圾收集器(GC)管理的重点区域,动态可扩展,大小由
-Xms(初始)和-Xmx(最大)控制。 - 堆空间不足且无法扩容时,抛出
OutOfMemoryError: Java heap space。
栈(Java 虚拟机栈)——每个线程的“私有工作台”
虚拟机栈是线程私有的,每个线程启动时自动创建,生命周期与线程一致。
- 它不存对象本身,而是为方法执行服务:每次调用方法,JVM 就压入一个栈帧(Stack Frame),方法结束则弹出。
- 每个栈帧包含三类关键内容:局部变量表(存基本类型值、对象引用)、操作数栈(临时运算空间)、方法返回地址(记录调用链位置)。
- 栈深度过大(如无限递归)会触发
StackOverflowError;若线程过多导致总栈内存超限,则可能抛出OutOfMemoryError: unable to create new native thread。 - 栈大小可通过
-Xss参数调整,默认一般为 1MB 左右。
方法区(Method Area)——类信息的“中央档案室”
方法区也是线程共享区域,用于存储已被加载的类元数据。
- 存放内容包括:类结构信息(字段、方法、接口定义)、运行时常量池(字符串常量、符号引用等)、静态变量、即时编译后的代码(如 JIT 编译的本地机器码)。
- JDK 8 之后,方法区的实现从“永久代(PermGen)”改为元空间(Metaspace),直接使用本地内存(Native Memory),不再占用堆空间,因此几乎不会因方法区满而引发堆相关的 OOM。
- 元空间大小由
-XX:MetaspaceSize和-XX:MaxMetaspaceSize控制;若元空间耗尽且无法扩展,抛出OutOfMemoryError: Metaspace。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











