运行时数据区之PC寄存器

运行时数据区

内部结构:

在这里插入图片描述
 其中有些是随着虚拟机的启动而创建,随着虚拟机退出而销毁。还有一些是与线程相对应的,随着线程的开始与结束而创建或销毁。

程序计数器、虚拟机栈、本地方法栈都属于每个线程私有的

方法区、堆是属于多个线程共享

程序计数器

 PC寄存器(Program Counter Register)中,寄存器存储指令相关的现场信息。

作用

 1.程序计数器用来存储指向下一条指令的地址,即将要执行的指令代码。【由执行引擎读取下一条指令】

 程序计数器是一个占用小的内存空间,也是运行速度最快的存储区域。

[注:每个线程都有它专属的程序计数器,生命舟曲与线程周期保持一致。]


 2.任何时间一个线程都只有一个方法在执行,即当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM地址。若是在执行native方法,则存储未指定值。

 3.程序计数器还是程序控制流的指示器,一些基础功能【分支、循环、跳转、异常处理、线程恢复等】都需要依赖程序计数器完成。

 字节码解释器工作 便是 通过改变这个计数器的指来选取下一条需要执行的字节码指令

它是唯一在JVM中没有归档OOM(OutOfMemoryError)情况的区域

思索的两个问题:

1.使用PC寄存器存储字节码指令地址有什么用?且为何使用程序计数器来记录呢?

  由于CPU需要不停地切换各个线程,当从其他线程归来时,需要明确从哪儿继续执行。

  因此JVM字节码解释器便通过改变程序计数器地值来明确下一条应该执行哪里的字节码指令。

2.PC寄存器为什么会被设定线程私有?

  多线程环境下,一个时间只会执行一个线程方法,因此CPU会不断地任务切换。
  这样便会导致中断 或者 归来时恢复执行。为了保证正确地执行,因此需要记录各个线程正在执行的当前字节码指令地址。
  故而每个线程都分配一个程序计数器,则各个线程之间便可以独立计算,不会出现互相影响的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值