每天每天
越来越爱

JVM程序计数器、虚拟机栈、本地方法栈 JVM虚拟机栈

程序计数器(PC寄存器)

官方文档

PC寄存器介绍

PC寄存器是很小的一块空间,几乎可以忽略不计,同时也是运行速度最快的区域。

PC寄存器是线程私有的,生命周期与线程周期一致

PC寄存器存储JVM虚拟机下一个指令地址

是唯一一个没有OutOfMemoryError的区域

PC寄存器作用

用来存储下一个指令的地址,由执行引擎读取下一条指令并执行该指令

线程是一个个顺序执行流,CPU需要不停的切换各个线程,在切换线程后,就通过PC寄存器来获取下一个执行命令

虚拟机栈

栈管运行,堆管存储

栈的单位是栈帧,栈不存在gc,因为栈只有出栈入栈的操作,并且有先进后出,后进先出的特点。

JVM调整栈空间大小

  • 使用参数 -Xss选项来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度。

-Xss1024m // 栈内存为 1024MBS
-Xss1024k // 栈内存为 1024KB

栈帧的构成

局部变量表:

也叫做局部变量表,局部变量数组。是一个数字数组。主要用于存放方法的参数和定义在方法体内的局部变量,是线程私有的,不存在安全问题。局部变量表的大小是在编译期间就确定的,在方法运行期间不会改变大小。方法嵌套的层数由栈的大小确定,栈越大,方法嵌套层数越多。局部变量表中的数据只在当前栈帧有效,方法结束后,局部变量表会销毁

一个栈帧对应一个方法,一个栈帧的入栈对应一个方法的调用,一个栈帧的出栈对应一个方法的结束,如果次存在异常,就会抛给上一个栈帧

操作数栈

操作数栈也成为表达式栈,也是先进后出的结构,也只有出栈入栈两个操作

  • 操作数栈的作用

    1. 主要用于保存计算过程中的中间结果,也就是保存方法中的临时变量
    2. 是JVM执行引擎的一个工作区,方法执行的时候,操作数栈就会创建,
    3. 每一个操作数栈都有一个明确的栈深度用来存储数值,即数组的大小
    4. 虽然是数组但是无法通过下标来访问,只能通过出栈,入栈来访问数据
    5. 如果方法有返回值,则会在上一个栈帧体现
动态链接(指向运行时的方法引用)
  • 每一个栈帧内部都包含一个指向运行时常量区中的该栈帧的引用
  • 动态链接就是将符号引用转换为方法的直接引用
方法返回地址

这里存放调用该方法的PC寄存器的值,正常执行结束,或者异常结束之后,都会返回到该方法被调用的位置。

附加信息

本地方法栈

本地方法栈主要用于本地方法的管理,也是线程私有的。本地方法一般是使用C语言编写的。它的具体做法是Native Method Stack中登记native方法,在执行引擎执行时加载本地方法库。

  • 当一个线程调用本地方法时,他就进入了一个不受虚拟机限制的环境,和虚拟机拥有同样的权限,
  • 本地方法可以通过本地方法接口来访问虚拟机内部的运行时数据区
  • 直接从本地内存的堆中分配任意数量的内存
  • 直接使用本地处理器中的寄存器
  • 不是所有的虚拟机都有本地方法栈
赞(0) 打赏

评论 抢沙发