随笔分类
运行时数据区
官网文章概述:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.2
线程私有的数据区生命周期和线程一致
PC寄存器
线程私有
JVM中PC是对物理PC的一种抽象模拟:程序钩子、行号指示器
存储指向下一条指令的地址:
-
唯一一个在JVM规范中没有规定任何OOM情况的区域
-
执行引擎去PC中地址
操作局部变量表、操作数栈
字节码翻译成机器码 --->交给CPU
java是线程抢占式
问题思考:
使用PC寄存器存储字节码指令地址有什么作用?
JVM的字节码解释器就需要改变PC寄存器的值来明确写一条应该执行什么样的字节码指令
为什么要使用PC寄存器来记录当前线程的执行地址?
因为CPU在不停地切换线程,切换回来之后需要知道接着从哪里开始继续执行
PC为什么是线程私有的?
多线程并发执行时,如果PC是公有的话,当线程切换回来时便会去执行错误的地址
为了准确的记录各个线程正在执行的当前字节码指令地址,不互相干扰,最好的方法便是为每个线程都分配一个PC寄存器。
且并发执行的线程,任何一个确定的时刻,一个处理器或多核处理器的一个内核,只会去执行一个线程中的一条指令,但由于CPU时间片轮限制,这样必然会导致经常的中断或恢复,为了保证分毫不差,每个线程在创建之后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间互不影响.