JVM之程序计数器
来源:互联网 发布:健体杰瑞米具体数据 编辑:程序博客网 时间:2024/06/03 10:10
冯·诺伊曼计算机体系结构的主要内容之一就是“程序预存储,计算机自动执行”,处理器要执行的程序(指令序列)都是以二进制代码序列方式预存储在计算机的存储器中,处理器将这些代码逐条地取到处理器中再译码、执行,以完成整个程序的执行。为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定下一条取址指令的地址,程序计数器正是起到这种作用,所以通常又称之为“指令计数器”。
程序计数器(Program Counter Register)是一块很小的内存空间,它是运行速度最快的存储区域,因为它位于不同于其他存储区的地方——处理器内部。寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。实际在JAVA应用程序内部你不能直接控制寄存器,也不能在程序中感觉到寄存器存在的任何迹象。我们可以把程序计数器看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器的工作就是通过改变程序计数器的值来选择下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖这个计数器来完成。
由于Java是支持多线程的语言,所以当线程数量超过CPU数量时,线程之间会自动根据时间片[1]轮询方式抢夺CPU资源。对于单核CPU而言,每一时刻只能有一个线程处于运行状态,其他线程必须被切换出去,直到轮询到自己才能使用CPU资源,为此,每一个线程都必须用一个独立的程序计数器,它被用来记录下一条需要执行的计算机指令。对于多核CPU来说,可以允许多个线程同时执行,各个线程之间的计数器互不影响、独立工作,所以程序计数器是线程独有的一块内存空间。如果当前线程正在执行一个Java方法,则程序计数器记录正在执行的Java字节码地址,如果当前线程正在执行一个Native方法,则程序计数器为空。根据Java虚拟机定义来看,程序寄存器区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。简单概括上面的描述,即在多线程环境下,为了让线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间互不影响、独立存储,因此这块内存是线程私有的。
JVM的架构是基于栈的,即程序指令的每一个操作都要经过入栈和出栈这样的组合型操作才能完成。JVM中的寄存器类似于物理寄存器的一种抽象模拟,正如前面说的,它是线程私有的,所以生命周期与线程的生命周期保持一致。
[1] 即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。
感兴趣的朋友可以关注麦克叔叔每晚10点说,让我们一起交流与学习。
- JVM之程序计数器
- jvm程序计数器
- jvm程序计数器
- jvm的程序计数器
- 【JVM内存模型】程序计数器
- JVM学习笔记——程序计数器
- jvm运行时数据区域 --- 程序计数器
- jvm 堆、栈、方法区、程序计数器
- JVM运行的数据分区----程序计数器实现的功能
- JVM学习02:运行时数据区域-程序计数器
- 程序计数器
- 程序计数器
- JVM6:Jvm程序计数器,Java栈,本地方法栈,本地方法接口
- JVM线程引擎和内存共享区的交互及程序计数器
- jvm虚拟机运行时内存分析,堆,栈,方法区,程序计数器,本地栈,常量池
- Hadoop之WordCount计数器程序编写并打包
- 3、计数器小程序
- php的计数器程序
- 搭建ssm框架
- MySql数据库-13数据库的备份与恢复
- springmvc报错:The request sent by the client was syntactically incorrect
- HIVE文件格式的map reduce代码编写
- 脚本启动shipyard
- JVM之程序计数器
- Python 赋值、浅拷贝、深拷贝的区别?
- webapi跨域
- px转为rem
- UITabelView 优化巧技
- PS切图
- Spring Boot系列(五)创建jar与热部署
- python terminal 生成二维码
- vmware station中 UDEV 无法获取共享存储磁盘的UUID,症状: scsi_id -g -u -d /dev/sdb 无返回结果。