这部分内容虽然是JVM中的定义,但是在juc中属于底层知识,必须要学习
每个线程在创建时,就会将自身的资源存储在栈中,将线程需要运行的方法存放在方法区。
栈中会存储方法的局部变量、方法的参数以及方法返回的地址,这部分在线程创建的初始化时就会被创建。
栈帧对应线程执行的方法,每执行一个方法就会创建一个栈帧,这个栈帧维护当前方法的对应局部变量、方法参数以及返回地址。
程序计数器用于记录当前执行到的程序,用于上下文切换。比如当前程序计数器为1,指向线程1,此时线程1CPU时间轮片耗尽,jvm会保存当前线程的运行环境,也就是栈帧里的数据内容,然后转向执行下一个线程,将程序计数器置为下个线程对应的值,然后就会去执行线程2,最后当CPU调度到线程1时,会根据栈帧的内容回复当前线程运行环境并继续执行当前线程。
注意:
JVM 中的“程序计数器”(PC 寄存器)记录的是什么
-
它不是线程 ID,也不是业务逻辑中的“程序编号”。
-
在 JVM 规范里,每个 Java 线程都有自己的一块 PC 寄存器,用来存放当前正在执行的字节码指令地址(即下一条要执行的指令的偏移量)。
-
举例来说,如果你在执行第 50 条
iload_1
,PC 寄存器可能保存的是 50;执行完后它自动增到 51,准备执行下一条指令。
保存的环境”具体包括:
-
Java 栈(Stack Frames):局部变量表、操作数栈、动态链接、返回地址
-
PC 寄存器的值:字节码的偏移量