Administrator
Administrator
Published on 2025-01-13 / 8 Visits
0
0

2025.01.13

JVM的运行时内存区域是怎样的?

根据 Java 虚拟机规范的定义,JVM 的运行时内存区域主要由 Java 堆、虚拟机栈、本地方法栈、方法区和程序计数器以及运行时常量池组成。其中堆、方法区以及运行时常量池是线程之间共享的区域,而栈(本地方法栈+虚拟机栈)、程序计数器都是线程独享的。

程序计数器:一个只读的存储器,用于记录 Java 虚拟机正在执行的字节码指令的地址。它是线程私有的,为每个线程维护一个独立的程序计数器,用于指示下一条将要被执行的字节码指令的位置。它保证线程执行一个字节码指令以后,才会去执行下一个字节码指令。

Java虚拟机栈:一种线程私有的存储器,用于存储 Java 中的局部变量。根据 Java 虚拟机规范,每次方法调用都会创建一个栈帧,该栈帧用于存储局部变量、操作数栈、动态链接、方法出口等信息。当方法执行完毕之后,这个栈帧就会被弹出,变量作用域就会结束,数据就会从栈中消失。

本地方法栈:本地方法栈是一种特殊的栈,它与 Java 虚拟机栈有着相同的功能,但是它支持本地代码(Native Code)的执行。本地方法栈中存放本地方法(Native Method)的参数和局部变量,以及其他一些附加信息。这些本地方法一般是用 C 等本地语言实现的,虚拟机在执行这些方法时就会通过本地方法栈来调用这些本地方法。

Java堆:是存储对象实例的运行时内存区域。它是虚拟机运行时的内存总体的最大的一块,也一直占据着虚拟机内存总量的一大部分。Java 堆由 Java 虚拟机管理,用于存放对象实例,是几乎所有的对象实例都要在上面分配内存。此外,Java 堆还用于垃圾回收,虚拟机发现没有被引用的对象时,就会对堆中对象进行垃圾回收,以释放内存空间。

方法区:用于存储已被加载的类信息、常量、静态变量、即时编译后的代码等数据的内存区域。每加载一个类,方法区就会分配一定的内存空间,用于存储该类的相关信息,这部分空间随着需要而动态变化。方法区的具体实现形式可以有很多种,比如堆、永久代、元空间等。

运行时常量池:是方法区的一部分。用于存储编译阶段生成的信息,主要有字面量符号引用常量两类。其中符号引用常量包括了类的全限定名称、字段的名称和描述符、方法的名称和描述符。


Comment