简介

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

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

PC 寄存器

程序计数器是一块很小的内存空间,几乎可以忽略不记,却是运行速度最快的存储区域。

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

任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM字节码指令地址;如果该方法执行的是Native方法,则程序计数器的值为空(Undefined)。

它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

它是唯一一个在Java虚拟机规范中没有 Out Of Memory(内存溢出)情况的区域。

作用

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

案例演示:

public class PCRegisterTest {

public static void main(String[] args) {

int i = 10;

int j = 20;

int k = i + j;

}

}

编译后的字节码:

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

工作原理简图

使用PC寄存器存储字节码指令地址有什么作用?

CUP线程调度

因为CPU需要不停的切换各个线程,从一个方法切换到另一个方法后,就要知道接着从哪开始继续执行。JVM的字节码解释器就可以通过读取PC寄存器的值来明确下一条应该执行什么样的字节码指令。

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

线程的PC寄存器

我们都知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?

为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。

CPU时间片

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

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

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

标签:Java,字节,PC,计数器,指令,线程,JVM,寄存器,CPU

来源: https://www.cnblogs.com/ruoli-0/p/13781170.html

java 计数程序_Java JVM——4.程序计数器相关推荐

  1. java金字塔程序_Java中的金字塔模式程序

    java金字塔程序 Pattern programs are used a lot in interviews to understand the logical thinking abilities ...

  2. java小程序_Java小程序

    java小程序 An applet is a special kind of Java program that runs in a Java enabled browser. This is the ...

  3. java工程窗口程序_java工程开发之图形化界面之(第二课)

    上一节主要是讨论小的应用程序,在这里我们将采用一种全新的方式来重新编写它. 在这里我们注重关注JFrame和JOptionPane.这些类提供了在JAVA应用程序使用图形的方法以及在JAVA程序中对I ...

  4. java网络程序_Java 网络程序

    Java在网络编程这个地方做的很好,java的主要目的也是为了网络而生的,它能方便的访问网络上的资源.我们这节课来介绍网络通讯的两种机制:URL通信机制,Socket通信机制. URL表示了Inter ...

  5. java 程序计数器 堆_Java JVM中程序计数器有什么作用?

    我们都知道虚拟机的内存划分了多个区域,并不是一张大饼.那么为什么要划分为多块区域呢,直接搞一块区域,所有用到内存的地方都往这块区域里扔不就行了,岂不痛快.是的,如果不进行区域划分,扔的时候确实痛快,可 ...

  6. 下载不了java应用程序_Java 7u45 - java webstart不会下载我的jar并执行应用程序,除非我显示java控制台...

    首先,对不起我的英语,这不是我的母语. 我的环境有: - jre 1.5.0_12(二进制) - jre 1.6.0_17(默认jre) - jre 1.7.0_45(二进制) 我有两种方法可以通过J ...

  7. java sslsocket程序_JAVA与C++进行sslsocket通信,JAVA做服务端或客户端

    前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈. 本文测试环境: 系统:WINDOWS 7(第3.6步).OS X 10.9(第4步) 软 ...

  8. java存款程序_JAVA实现账户取款和存款操作

    这篇文章主要介绍了JAVA实现账户取款和存款操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JAVA 编写一个程序完成从某账户取款和存款的操作 ...

  9. java 单开程序_java生成jar包并且单进程运行的实例

    java文件打包jar运行 有效步骤: 1.cmd 到当前目录(默认包主类所在目录为例) set classpath = 默认包主类所在目录 2.javac 主类名.java 3.java 主类名 4 ...

  10. java 栈 大小_java – JVM堆栈大小规范

    Question, what does 1 MB stack size states in JVM as I have no idea what size a stack frame of? 1 MB ...

最新文章

  1. iOS之coreData
  2. BSP UI Workbench double click component and see view list
  3. 小小c#算法题 - 3 - 字符串语句反转
  4. Intellij IDEA Debug调试技巧
  5. Windows 启动方式总结(转)
  6. (原创)我眼中的设计模式系列之外观模式(二)
  7. java oom分析_JAVA各种OOM代码示例与解决方法
  8. linux 查看hive版本号,如何从命令提示符知道Hive和Hadoop版本?
  9. 如何将MAPGIS中的文件转换为SHP格式,及坐标系问题
  10. V-by-One基础知识
  11. linux嵌入式reboot不生效,Embeded linux之reboot
  12. esp8266调用心知天气
  13. 网线水晶头制作及标准接法教程,新手必备技能
  14. 我努力了十年,才让我的老婆不上班
  15. 使用七牛云存储解决ios7.1的app部署问题 https
  16. 学计算机游戏与动漫好吗,学习计算机动漫与游戏制作前途如何?
  17. python-字符串 修改间隔符 and定义变量 交换变量
  18. 修改MySQL 数据库 密码
  19. 生活中有趣好玩的产品设计
  20. DX11(九):处理键盘鼠标输入

热门文章

  1. 如何让C/S应用支持多端(PC、Android、iOS)同时登录?
  2. ATC空管系统的实时控制软件系统分析
  3. C#部分---arraylist集合、arraylist集合中的object数据转换成int类string类等;间隔时间的表示方法;...
  4. [Leetcode] Pascal's Triangle II
  5. CheckedListBoxControl 实现复选框的单选与多选功能
  6. bzoj 1024 SCOI2009 生日快乐
  7. 如何搭建自己的开发环境
  8. TreeView中丢失的图标
  9. 一作解读NLPCC最佳学生论文:1200万中文对话数据和预训练模型CDial-GPT
  10. 【学术杂谈】博士毕业都去哪儿了,谈谈学术的这条路该如何走