JVM---运行时数据区

JVM 运行时数据区

在这里插入图片描述
如上图所示,JVM运行时数据区主要分为:

 1. pc寄存器
 2. Java虚拟机栈
 3. Java堆
 4. 方法区
 5. 运行时常量池
 6. 本地方法栈

1.pc寄存器

首先,JVM中的pc寄存器本质上是JVM中的一小块内存。Java虚拟机可以支持多个线程同时执行,而且每一个线程都会有一个pc寄存器,和通常的pc寄存器一样,每个线程的pc寄存器会记录当前线程所执行的指令的地址,但是在java虚拟机的pc寄存器有点不同。如果线程执行的代码时native(使用java以外的语言编写的代码)的,那pc寄存器的值时undefined;如果执行的代码不是native的,那pc寄存器保存的就是正在执行的字节码指令的地址

2.Java 虚拟机栈

对于在java 虚拟机中运行的多个线程来说,每一个线程都有自己一个属于自己的( 即私有的 )Java 虚拟机栈。在线程启动时,Java 虚拟机栈也随之创建。Java虚拟机栈用来存储栈帧,与C语言中的栈帧相似,栈帧用来存储局部变量和函数的信息等,Java 虚拟机栈所使用的内存可以是不连续的。
在Java虚拟机规范中并没有规定Java 虚拟机栈的大小,实际在实现Java 虚拟机时,虚拟机栈可以是固定大小的,也可以动态变化的。

  • 如果线程请求分配的容量超过Java 虚拟机栈允许的最大容量,Java虚拟机将会抛出 StackOverflowError 异常;
  • 如果Java 虚拟机栈可以动态扩展,并且在尝试扩展时未申请到足够的内存,或者在创建新的线程时没有足够的内存,则抛出 OutOfMemoryError 异常。

3.本地方法栈

native方法即使用java以外的语言编写的方法,当Java 虚拟机中的线程执行的代码来自native方法时,Java 虚拟机中就会使用本地方法栈来执行native方法。如果实现Java 虚拟机时实现了支持native方法,则本地方法栈一般会在线程创建时按线程分配。与Java 虚拟机栈类似,本地方法栈也有可能引发类似的 StackOverflowError 和 OutOfMemoryError 异常。

4.Java 堆

Java 堆是运行在虚拟机中的所有线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。
Java 虚拟机启动时也伴随着 Java堆 的创建,它存储着 GC 所管理的各种对象,这些对象都无法显示地销毁。Java堆的容量可以是固定的,也可以是动态扩展的,而且所使用的内存可以是不连续的。
如果所使用的堆超过了 GC 能提供的最大容量,则Java虚拟机会抛出 OutOfMemoryError 异常。

5.方法区

方法区 也是运行在虚拟机中的所有线程共享的运行时内存区域,在虚拟机启动时即创建。方法区用于存储每一个类的结构信息,例如运行时常量池、字段、方法数据、构造函数和普通方法的字节码内容,还包括一些在类、实例、接口初始化时用到的特殊方法。
方法区的容量可以是固定的,也可以是动态扩展的,在实际的内存空间中可以是不连续的,如果方法区的内存不能满足内存分配请求,则抛出 OutOfMemoryError 异常。

6.运行时常量池

每个运行时常量池都是在方法区中分配的,class文件中的每一个类或者接口所用到数值字面常量、运行期解析后才能获得的方法和字段引用都存放在各自的运行时常量池中。在加载类或接口到虚拟机后就创建相应的运行时常量。
如果在创建类或接口时,运行时常量池所需的内存空间超过了方法区所能提供的最大值,则抛出 OutOfMemoryError 异常。

猜你喜欢

转载自blog.csdn.net/Miha_Singh/article/details/88688062