JVM内存五大核心区域为程序计数器、虚拟机栈、本地方法栈、堆、方法区,另含直接内存;前三个线程私有,后两个线程共享,各自承担指令定位、方法执行、Native调用、对象存储、类元数据管理及堆外IO等职责。

JVM 内存区域按功能和生命周期划分为多个独立部分,每一块承担明确职责,共同支撑 Java 程序的执行、线程调度与内存管理。下面直接说明各区域的核心用途:
程序计数器:线程的“指令定位器”
记录当前线程正在执行的字节码指令地址,相当于每条线程专属的“行号指示器”。它保证线程切换后能准确恢复执行位置,支撑分支、循环、异常处理等流程控制。该区域极小、线程私有,且不会发生 OutOfMemoryError。
虚拟机栈:Java 方法的执行容器
每个方法调用对应一个栈帧,栈帧中存放局部变量表、操作数栈、动态链接、方法出口等信息。方法入栈即开始执行,出栈即结束并自动释放资源。它是线程私有、生命周期与线程一致的区域,异常包括 StackOverflowError(深度超限) 和 OutOfMemoryError(扩展失败)。
本地方法栈:为 Native 方法服务的执行栈
作用与虚拟机栈类似,但专用于 JNI 调用的本地方法(如 C/C++ 实现的代码)。同样线程私有,也支持动态扩展,异常类型与虚拟机栈一致。
堆:对象实例与数组的唯一归属地
所有通过 new 创建的对象、数组都分配在堆中,是线程共享区域,也是垃圾回收(GC)的主要场所。JDK 8+ 按对象年龄分代管理:
- 新生代(Eden + Survivor):存放新创建、短期存活对象
- 老年代:长期存活或大对象
内存不足时抛出 OutOfMemoryError: Java heap space。
方法区(元空间):类元数据的集中存储区
JDK 8 后以元空间(Metaspace)替代永久代,位于本地内存。存储类结构信息(类名、字段、方法)、运行时常量池、静态变量等。线程共享,加载过多类或反射生成大量代理类时可能触发 OutOfMemoryError。
直接内存:堆外高性能 IO 缓冲区
通过 ByteBuffer.allocateDirect() 分配,不属于 JVM 规范定义的运行时数据区,但被广泛使用。用于 NIO 场景,避免堆内与内核间的数据拷贝,提升文件/网络读写效率。其大小不受 -Xmx 限制,但需注意系统物理内存总量,泄漏会导致系统级 OOM。

















