程序计数器(PC寄存器)
PC寄存器介绍
PC寄存器是很小的一块空间,几乎可以忽略不计,同时也是运行速度最快的区域。
PC寄存器是线程私有的,生命周期与线程周期一致
PC寄存器存储JVM虚拟机下一个指令地址
是唯一一个没有OutOfMemoryError的区域
PC寄存器作用
用来存储下一个指令的地址,由执行引擎读取下一条指令并执行该指令
线程是一个个顺序执行流,CPU需要不停的切换各个线程,在切换线程后,就通过PC寄存器来获取下一个执行命令
虚拟机栈
栈管运行,堆管存储
栈的单位是栈帧,栈不存在gc,因为栈只有出栈入栈的操作,并且有先进后出,后进先出的特点。
JVM调整栈空间大小
- 使用参数
-Xss
选项来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度。
-Xss1024m // 栈内存为 1024MBS
-Xss1024k // 栈内存为 1024KB
栈帧的构成
局部变量表:
也叫做局部变量表,局部变量数组。是一个数字数组。主要用于存放方法的参数和定义在方法体内的局部变量,是线程私有的,不存在安全问题。局部变量表的大小是在编译期间就确定的,在方法运行期间不会改变大小。方法嵌套的层数由栈的大小确定,栈越大,方法嵌套层数越多。局部变量表中的数据只在当前栈帧有效,方法结束后,局部变量表会销毁
一个栈帧对应一个方法,一个栈帧的入栈对应一个方法的调用,一个栈帧的出栈对应一个方法的结束,如果次存在异常,就会抛给上一个栈帧
操作数栈
操作数栈也成为表达式栈,也是先进后出的结构,也只有出栈入栈两个操作
-
操作数栈的作用
- 主要用于保存计算过程中的中间结果,也就是保存方法中的临时变量
- 是JVM执行引擎的一个工作区,方法执行的时候,操作数栈就会创建,
- 每一个操作数栈都有一个明确的栈深度用来存储数值,即数组的大小
- 虽然是数组但是无法通过下标来访问,只能通过出栈,入栈来访问数据
- 如果方法有返回值,则会在上一个栈帧体现
动态链接(指向运行时的方法引用)
- 每一个栈帧内部都包含一个指向运行时常量区中的该栈帧的引用
- 动态链接就是将符号引用转换为方法的直接引用
方法返回地址
这里存放调用该方法的PC寄存器的值,正常执行结束,或者异常结束之后,都会返回到该方法被调用的位置。
附加信息
本地方法栈
本地方法栈主要用于本地方法的管理,也是线程私有的。本地方法一般是使用C语言编写的。它的具体做法是Native Method Stack中登记native方法,在执行引擎执行时加载本地方法库。
- 当一个线程调用本地方法时,他就进入了一个不受虚拟机限制的环境,和虚拟机拥有同样的权限,
- 本地方法可以通过本地方法接口来访问虚拟机内部的运行时数据区
- 直接从本地内存的堆中分配任意数量的内存
- 直接使用本地处理器中的寄存器
- 不是所有的虚拟机都有本地方法栈