Broad Broad
首页
  • 中间件相关

    • RabbitMQ
前端
JVM
杂文
八股文
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Wang Bu Zheng

开发农名工
首页
  • 中间件相关

    • RabbitMQ
前端
JVM
杂文
八股文
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 类的加载

  • Jvm内存结构

    • 程序计数器
    • 虚拟机栈
    • 本地方法栈
    • 堆
    • 方法区
  • GC垃圾回收

  • JVM
  • Jvm内存结构
WangBuZheng
2023-01-04
目录

程序计数器

# 程序计数器

程序计数寄存器(Program Counter Register),Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的线程信息,CPU 只有把数据装载到寄存器才能够运行。

这里,并非是广义上所指的物理寄存器,叫程序计数器(或PC计数器或指令计数器)会更加贴切,并且也不容易引起一些不必要的误会。JVM 中的 PC 寄存器是对物理 PC 寄存器的一种抽象模拟。

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。

# 一.概述

  • 它是一块很小的内存空间,几乎可以忽略不计。也是运行最快的存储区域。
  • 在JVM规范中,每个线程都有自己的程序计数器,是线程私有。生命周期与线程的生命周期保持一致
  • 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行java方法的JVM指令地址。 如果正在执行的是本地(Native)方法,这个计数器值则应为空(Undefined)
  • 此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域

# 二.作用

PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。

pc寄存器存储栈帧中当前方法的指令地址,并由执行引擎读取。

# 三.实际操作查看

使用javap- v查看后可知,这些数字就是所说的指令地址,而后面那些就是操作指令。 我们拿指令地址 5 来说,存储在了PC寄存器中而执行引擎去PC寄存器去取。得到相应的操作指令。

# 四.总结

  • 用PC寄存器存储字节码指令有何用处?

《深入理解虚拟机》书中提到: 由于Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一 个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因 此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器

  • PC寄存器为何需要线程私有?

寄存器存储的是java栈中当前方法(当前栈帧)内的一系列指令地址。如果不是线程私有,比如第一个线程记录了指令地址6 cpu分配到第二个线程执行到了 8。那当再回到第一个线程时 指令地址已经是8了,导致一系列问题。线程私有就在于保证每个线程中寄存器存储 的指令地址不被更改,即使不在当前线程,回来的时候还是接着存储的指令地址继续执行。

编辑 (opens new window)
#JVM
上次更新: 2023/01/05, 06:33:52
类加载器
虚拟机栈

← 类加载器 虚拟机栈→

最近更新
01
垃圾回收算法-清除
03-28
02
垃圾回收算法-标记
02-13
03
方法区
02-03
更多文章>
Theme by Vdoing | Copyright © 202102-2023 Broad-Bean | 豫ICP备2022009421号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式