2026-10-24 13:28:48
JVM(Java虚拟机)的内存模型,即运行时数据区,是JVM在执行Java程序时所管理的内存区域划分,主要分为以下五个核心部分:

程序计数器
作用:记录当前线程执行的字节码指令地址(执行Java方法时)或为空(执行Native方法时)。
特性:线程私有,生命周期与线程一致,是JVM中唯一不会抛出OutOfMemoryError的区域。
意义:支持多线程切换时恢复执行位置,确保线程安全。
Java虚拟机栈
作用:存储方法调用的栈帧,每个栈帧包含局部变量表、操作数栈、动态链接和方法出口等信息。
局部变量表:存储方法内的局部变量(基本类型直接存值,引用类型存对象地址),大小在编译期确定。
异常:栈深度超过限制会抛出StackOverflowError;扩展失败时抛出OutOfMemoryError。
线程私有:每个线程有独立的虚拟机栈,生命周期与线程同步。
本地方法栈
作用:为Native方法(非Java代码实现的方法)提供服务,结构与虚拟机栈类似。
实现差异:部分虚拟机(如HotSpot)将本地方法栈与虚拟机栈合并,不单独区分。
异常:与虚拟机栈一致,可能抛出StackOverflowError或OutOfMemoryError。
Java堆
作用:存放对象实例,是JVM管理的最大内存区域,也是垃圾回收的主要目标。
特性:线程共享,逻辑连续但物理可不连续,可通过-Xmx和-Xms调整大小。
异常:内存不足且无法扩展时抛出OutOfMemoryError。
优化:部分对象可能通过逃逸分析在栈上分配,减少堆压力。
方法区
作用:存储类的元数据(类名、字段、方法)、静态变量、常量及编译后的代码。
别名:称为“非堆”(Non-Heap),与Java堆逻辑区分。
实现:HotSpot虚拟机通过“永久代”实现方法区,但两者本质不同(永久代使用堆内存管理)。
运行时常量池:方法区的一部分,存储编译期生成的字面量和符号引用(如字符串常量、类名引用)。
异常:永久代内存不足时抛出OutOfMemoryError(JDK 8后元空间替代永久代,使用本地内存)。

通过以上划分,JVM实现了高效的内存管理、线程隔离和跨平台支持,是Java程序稳定运行的基础。