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编译代码;

方法区的作用:

  • 支持类加载;
  • 方法调用的元数据支持;
  • 反射机制的基础;
posted @ 2025-04-14 10:19  Ohana+  阅读(10)  评论(0)    收藏  举报