JVM上篇:内存与垃圾回收篇–运行时数据区四-程序计数器

1.介绍

JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器**存储指令相关的现场信息。**CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。

  • 它是一块很小的内存空间,几乎可以忽略不记。也是JVM运行速度最快的存储区域

  • 在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致

  • 任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址;或者,如果是在执行native方法,则是未指定值(undefned)

    • 本地方法需要调用C/C++库所以是undefned
  • 它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

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

  • 它是唯一一个在Java虚拟机规范中没有规定任何outotMemoryError情况的区域

    • 同时也不会存在GC,只是存储下一条指令地址

2.作用

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

3.代码示例

写一个简单的代码

public class PCRegisterTest {public static void main(String[] args) {int i = 10;int j = 20;int k = i + j;String s = "abc";System.out.println(i);System.out.println(k);}
}

然后将代码进行编译成字节码文件,我们再次查看 ,发现在字节码的左边有一个行号标识,它其实就是指令地址,用于指向当前执行到哪里。

    0: bipush        102: istore_13: bipush        205: istore_26: iload_17: iload_28: iadd9: istore_310: ldc           #2                  // String abc12: astore        414: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;

通过PC寄存器,我们就可以知道当前程序执行到哪一步了

执行引擎通过寄存器中的指令地址找到操作命令,来操作局部变量表,操作数栈及向CPU发送机器指令

4.寄存器的两个常见问题

4.1 使用PC寄存器存储字节码指令地址有什么用呢?/为什么使用PC寄存器记录当前线程的执行地址呢?

因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。

JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令

4.2PC寄存器为什么被设定为线程私有的?

我们都知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。

由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或者多核处理器中的一个内核,只会执行某个线程中的一条指令。

这样必然导致经常中断或恢复,如何保证分毫无差呢?每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间互不影响。

5. CPU时间片

CPU时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片。

在宏观上:俄们可以同时打开多个应用程序,每个程序并行不悖,同时运行

但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行

JVM上篇:内存与垃圾回收篇--运行时数据区四-程序计数器相关推荐

  1. JVM(七) -- 内存与垃圾回收(二) -- 运行时数据区(四) -- Java堆

    运行时数据区最重要的内容,对应书中2.2.4节.3.8节. 位置: 1. 概述 一个java进程对应一个jvm虚拟机,也对应一个堆空间 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域 ...

  2. 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...

  3. 最全的 JVM 面试知识点(一):运行时数据区

    转自: https://blog.csdn.net/keets1992/article/details/92089754 不是码农,不会敲代码的她,却最懂程序员!| 人物志: https://blog ...

  4. 类加载子系统【JVM之内存与垃圾回收篇】

    类加载子系统 概述 类加载子系统作用 类加载的过程 加载阶段 链接阶段 验证 Verify 准备 Prepare 解析 Resolve 初始化阶段 类加载器的分类 虚拟机自带的加载器 启动类加载器(引 ...

  5. JVM(Java虚拟机模型、Java运行时数据区模型)

    一.Java代码运行原理 .java编译变成.class文件. 类加载器把.class字节码文件加载到JVM中. JVM中的字节码执行引擎从指定的main()方法开始执行代码. 二.类被加载的时机 代 ...

  6. java多线程内存隔离_JVM之Java运行时数据区(线程隔离区)

    JVM会在会在执行Java程序过程中把所管理的内存划分为若干区域,主要包括程序计数器(Program Counter Register),虚拟机栈(VM Stack),本地方法栈(Native Met ...

  7. 【JVM】3. 运行时数据区及程序计数器

    文章目录 3.1.

  8. Java程序员必知必会之JVM运行时数据区

    JVM类加载概述 JVM垃圾回收概述 运行时数据区概述 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要 ...

  9. Java -----JVM运行时数据区

    一.JVM体系结构 想要了解运行时数据区,先关注一下JVM的体系结构,知道数据区在JVM的整体位置和作用. 二.JVM运行时数据区 1.程序计数器 一块较小的内存空间,它是当前线程所执行的字节码的行号 ...

  10. 从头开始学习->JVM(八):运行时数据区(下)

    前言 在上一篇文章中,我们了解到了JVM的运行时数据区,基本被划分了5个区域. 程序计数器(pc寄存器) java虚拟机栈 本地方法栈 java堆 方法区(永久代,元空间). 而上一篇文章中,我们详细 ...

最新文章

  1. python使用imbalanced-learn的ADASYN方法进行上采样处理数据不平衡问题
  2. linux3.0 nand分区,OK6410(256MRAM2Gnandflash) Linux3.0.1内核移植
  3. Js Call方法详解(js 的继承)
  4. 交换排序 —— 快速排序
  5. useGeneratedKeys的详解
  6. 搜索推荐炼丹笔记:酒店搜索位置偏差的边际重要性
  7. 结构体+sort方法
  8. 02326 操作系统 简答题 超简短归纳
  9. bme280 环境传感器开发板_半导体所在柔性湿度传感器与非接触控制方面取得进展...
  10. 用es5实现es6的promise,彻底搞懂promise的原理
  11. C/C++ 头文件的作用和用法
  12. 掘金翻译计划 GitHub Star 破3千--终于等到你
  13. go 获取屏幕分辨率_CS:GO枪神的自我修养 高刷电竞显示器推荐
  14. Win10 桌面美化
  15. 苹果电脑双系统虚拟机怎么安装?
  16. 如何制作一个餐厅下单和外卖二维码?
  17. 设计模式——使用TypeScript实现代理模式
  18. 开juǎn有益系列(一)——Binary search(二分查找/折半查找算法)
  19. 猿辅导python资源_2020猿辅导(小猿搜题)高中辅导全资源合集百度网盘下载
  20. 等效结点荷载计算机语言,等效节点荷载,equivalent node load,音标,读音,翻译,英文例句,英语词典...

热门文章

  1. 计算机二级幻灯片母版奇数页,计算机二级office考试中PPT母版知识考察点有哪些...
  2. 雷达多普勒频率计算公式_智能驾驶之眼-毫米波雷达技术详解
  3. 仿秒秒测日历页面和部分功能
  4. 网站cdn加速哪个好,10个免费网站cdn加速推荐
  5. 运营方法 - 运营的思考方法
  6. BOOST电路参数计算
  7. OJ每日一练——鸡兔同笼问题
  8. 计算机excel猪肉价格分析,猪肉价格的统计模型.doc
  9. python求梯形面积_python计算梯形面积
  10. python搭建自己的网站_Python+Django搭建自己的blog网站