画图学JVM(六) 04 程序计数器

一、 内容结构图

本章主要介绍 PC 寄存器的相关知识, 包括为什么叫这个名字? 程序计数器有什么作用?有哪些特征, 并通过一个实例详细介绍,最后介绍两个面试常见的问题。
画图学JVM(六) 04 程序计数器

二、程序计数器介绍

2.1 程序计数器所处的位置

画图学JVM(六) 04 程序计数器
程序计数器又叫 PC 寄存器(Program Counter Register)。PC 寄存器并非物理寄存器,翻译为程序计数器更贴切(也称为程序钩子),并且也不容易引起不必要的误会。JVM 中的 PC 寄存器是对物理寄存器的一种抽象模拟。

2.2 程序计数器的作用

画图学JVM(六) 04 程序计数器用来存储指向下一条指令的地址,由引擎读取下一条指令。它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要这个计数器来完成。字节码解释器工作时,通过改变计数器的值来选取指令执行。

2.3 特点

  • 唯一一个在 Java 虚拟机规范中没有规定 OOM 的区域
  • 它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域
  • 在 JVM 规范中,每个线程都有他自己的程序计数器,是线程私有的,生命周期与线程生命周期保持一致

2.4 存放的内容

  • 执行 Java 方法时:当前方法的 JVM 下一条指令地址
  • 执行 Native 方法时:未指定值(undefined)

二、举例说明

2.1 代码与字节码

画图学JVM(六) 04 程序计数器使用 javap 命令查看字节码文件(.class)

2.2 从执行的角度看程序计数器

画图学JVM(六) 04 程序计数器

  1. 执行引擎从当前线程的程序计数器获取指令地址(偏移地址)。
  2. 根据指令地址获取字节码指令访问和操作数栈、本地变量表等。
  3. 字节码指令会解释或编译成机器指令后,交给 CPU执行。

三、两个常见问题

3.1 问题一

使用 PC寄存器指令地址有什么用呢?
为什么使用 PC 寄存器记录当前线程的执行地址呢?
PC 寄存器存储指向下一条指令的地址,由引擎读取下一条指令。它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要这个计数器来完成。字节码解释器工作时,通过改变计数器的值来选取指令执行。

3.2 问题二

PC 寄存器为什么要设定为线程私有?
多线程的并发是指在一个时间段内多个线程轮流执行,但某一个时间点上,只有一个线程在执行,CPU 在任务切换时,需要不停将线程中断或恢复。为了能够准确记录各个线程正在执行的字节码指令地址,最好的办法就是为每个线程都分配一个 PC 寄存器。每个线程创建后,都生成各自的程序计数器和栈帧,这样在中断和恢复运行时线程就互不影响了。

3.3 并发行与并发简介

画图学JVM(六) 04 程序计数器

  • 时间片:是分时操作系统分配给每个正在运行的进程微观上的一段 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》推荐的资料和工具集.