画图学JVM(六) 04 程序计数器
目录
一、 内容结构图
本章主要介绍 PC 寄存器的相关知识, 包括为什么叫这个名字? 程序计数器有什么作用?有哪些特征, 并通过一个实例详细介绍,最后介绍两个面试常见的问题。
二、程序计数器介绍
2.1 程序计数器所处的位置
程序计数器又叫 PC 寄存器(Program Counter Register)。PC 寄存器并非物理寄存器,翻译为程序计数器更贴切(也称为程序钩子),并且也不容易引起不必要的误会。JVM 中的 PC 寄存器是对物理寄存器的一种抽象模拟。
- 官方说明
各版本地址
https://docs.oracle.com/javase/specs/index.html
JDK 8 地址
https://docs.oracle.com/javase/specs/jvms/se8/html/
2.2 程序计数器的作用
用来存储指向下一条指令的地址,由引擎读取下一条指令。它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要这个计数器来完成。字节码解释器工作时,通过改变计数器的值来选取指令执行。
2.3 特点
- 唯一一个在 Java 虚拟机规范中没有规定 OOM 的区域
- 它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域
- 在 JVM 规范中,每个线程都有他自己的程序计数器,是线程私有的,生命周期与线程生命周期保持一致
2.4 存放的内容
- 执行 Java 方法时:当前方法的 JVM 下一条指令地址
- 执行 Native 方法时:未指定值(undefined)
二、举例说明
2.1 代码与字节码
使用 javap 命令查看字节码文件(.class)
2.2 从执行的角度看程序计数器
- 执行引擎从当前线程的程序计数器获取指令地址(偏移地址)。
- 根据指令地址获取字节码指令访问和操作数栈、本地变量表等。
- 字节码指令会解释或编译成机器指令后,交给 CPU执行。
三、两个常见问题
3.1 问题一
使用 PC寄存器指令地址有什么用呢?
为什么使用 PC 寄存器记录当前线程的执行地址呢?
PC 寄存器存储指向下一条指令的地址,由引擎读取下一条指令。它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要这个计数器来完成。字节码解释器工作时,通过改变计数器的值来选取指令执行。
3.2 问题二
PC 寄存器为什么要设定为线程私有?
多线程的并发是指在一个时间段内多个线程轮流执行,但某一个时间点上,只有一个线程在执行,CPU 在任务切换时,需要不停将线程中断或恢复。为了能够准确记录各个线程正在执行的字节码指令地址,最好的办法就是为每个线程都分配一个 PC 寄存器。每个线程创建后,都生成各自的程序计数器和栈帧,这样在中断和恢复运行时线程就互不影响了。
3.3 并发行与并发简介
- 时间片:是分时操作系统分配给每个正在运行的进程微观上的一段 CPU 时间,时间片通常很短(在Linux 上为5ms-800ms),用户不会感觉到。
- 串行:线程按先后顺序执行, 并且在一个线程执行完成后才切换另一个线程执行。
- 并行:同一时间点多个线程同时运行。多核或集群。
- 并发:就是指多个线程在一个时间段内通过时间片轮番执行, 一个时间点上只有一个线程在运行。线程轮番穿插地运行 ,“看起来像”同时运行的。
系列学习
画图学JVM(一)相关资料和学习计划 《硅谷2020最新版宋红康JVM》
画图学JVM(二)章节目录
画图学JVM(三)01 JVM 与 Java 体系结构
画图学JVM(四)02 类加载子系统
画图学JVM(五) 03 运行时数据区概述和线程
画图学JVM(六) 04 程序计数器
附件
《尚硅谷2020最新版宋红康JVM》01 JVM 与 Java 体系结构 学习记录 PPT
《尚硅谷2020最新版宋红康JVM》02 类加载子系统 学习记录 PPT
《尚硅谷2020最新版宋红康JVM》03 运行时数据区概述和线程 PPT
《尚硅谷2020最新版宋红康JVM》04 程序计数器 PPT
《尚硅谷2020最新版宋红康JVM》推荐的资料和工具集.