JVM内存区域
JVM内存区域
JVM在执行Java程序的过程中,会将JVM管理的内存划分为若干不同的数据区域,这些区域被称为运行时数据区。
运行时数据区
运行时数据区就是JVM在运行Java程序时管理的内存区域:
| 分类标准 | 数据区域 |
| 线程共享 | 方法区 |
| 线程共享 | 堆 |
| 线程独享 | 程序计数器 |
| 线程独享 | 虚拟机栈 |
| 线程独享 | 本地方法栈 |
程序计数器
程序计数器可以看作是线程执行的字节码的行号指示器,存储当前线程正在执行的字节码指令地址。
程序计数器的特点:
- 占用内存空间小:JVM规范唯一规定了不会发生OutOfMemoryError的内存区域;
- 线程私有:每个线程都需要有一个独立的程序计数器,各个线程之间的程序计数器互不影响,独立存储;
- 存储内容:字节码指令的地址;
程序计数器的作用:
- 指令定位:确定下一条需要执行的字节码指令位置;
- 执行控制:字节码解释器通过改变程序计数器的值来控制程序流程;
- 线程恢复:线程切换后恢复到正确的执行位置;
虚拟机栈
虚拟机栈是支撑Java方法执行的内存区域,用于管理方法的调用和执行。每个方法在执行时都会创建一个栈帧,方法从调用到执行完成,就对应着栈帧在虚拟机栈中的入栈和出栈过程。
栈帧是方法执行的基本单元,用于存储方法中的局部变量表、操作数栈、动态链接、方法出口等信息。
虚拟机栈的特点:
- 线程私有:每个线程有自己的虚拟机栈,互不影响;
- 后进先出:栈帧的入栈和出栈遵循后进先出方式;
- 存储内容:栈帧;
虚拟机栈的作用:
- 管理Java方法的执行:栈帧的入栈、出栈和销毁;
Native方法是 Java 中通过JNI调用的非Java 实现的方法,通常由 C、C++ 或汇编语言编写,用于实现 Java 无法直接操作的系统级功能或高性能计算。
本地方法栈
本地方法栈是支撑Native方法执行的内存区域,专门支持JNI调用非Java语言编写的本地代码
本地方法栈的特点:
- 线程私有:每个线程有自己的本地方法栈,互不影响;
- 后进先出:Native方法调用时入栈,返回时出栈;
- 存储内容:本地方法的局部变量、方法调用信息、操作数栈、JNI环境信息和返回地址;
本地方法栈的作用:
- 管理Native方法的执行:Native方法的入栈、出栈;
堆
堆是JVM管理的最大且最核心的内存区域,用于存储所有对象实例和数组,是进行垃圾收集的主要区域。
现代JVM采用分代收集算法,将堆划分成不同的区域(Java8+堆内存划分:新生代、老年代、元空间)。
堆的特点:
- 线程共享:所有线程使用同一个堆;
- 无物理不连续:逻辑上是连续的空间,物理上可以有不同的内存快组成;
堆的作用:
- 存储所有对象实例和数组;
- 自动内存管理(垃圾回收);
- 支持多线程共享数据;
方法区
方法区是 JVM 规范定义的逻辑内存区域,用于存储**类信息、常量、静态变量等数据**。
方法区的特点:
- 线程共享:JVM规范描述方法区为堆的一个逻辑部分,与堆一样可以被线程共享;
- 存储内容:类元信息、运行时常量池、静态变量、方法字节码、JIT编译代码;
方法区的作用:
- 支持类加载;
- 方法调用的元数据支持;
- 反射机制的基础;

浙公网安备 33010602011771号