一,运行时数据区
Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。
1.1 程序计数器
程序计数器(Program Counter Register)也叫PC寄存器,每个线程会通过程序计数器记录当前要执行的的字 节码指令的地址。
在加载阶段,虚拟机将字节码文件中的指令读取到内存之后,会将原文件中的偏移量转换成内存地址。每一条字节码指令都会拥有一个内存地址
程序计数器可以控制程序指令的进行,实现分支、跳转、异常等逻辑。
在多线程执行情况下,Java虚拟机需要通过程序计数器记录CPU切换前解释执行到那一句指令并继 续解释运行。
程序计数器在运行中会出现内存溢出吗?
- 内存溢出指的是程序在使用某一块内存区域时,存放的数据需要占用的内存大小超过了虚拟机能提供的内存上限。
- 因为每个线程只存储一个固定长度的内存地址,程序计数器是不会发生内存 溢出的。
- 程序员无需对程序计数器做任何处理。
1.2 栈
Java虚拟机栈与本地方法栈
1.2.1 虚拟机栈
Java虚拟机栈(Java Virtual Machine Stack)采用栈的数据结构来管理方法调用中的基本数据,先 进后出(First In Last Out),每一个方法的调用使用一个栈帧(Stack Frame)。
Java虚拟机栈随着线程的创建而创建,而回收则会在线程的销毁时进行。由于方法可能会在不同线程中执行,每个线程都会包含一个自己的虚拟机栈。
1.2.2 栈帧
- 局部变量表的作用是在方法执行过程中存放所有的局部变量。编译成字节码文件时就可以确定局部变 量表的内容。
- 操作数栈是栈帧中虚拟机在执行指令过程中用来存放临时数据的一块区域
- 帧数据主要包含动态链接、方 法出口、异常表的引用
1.2.1.1 局部变量表
局部变量表的作用是在方法执行过程中存放所有的局部变量</