程序计数器

程序计数器

在运行时数据区中,它是线程隔离的一块内存区域,即它是线程私有的内存区域
同时它是一块很小的内存区域,可以看做当前线程所执行字节码的行号指示器。

即,程序计数器就是用于存放下一条指令所在单元的地址的地方

字节码指示器

Java虚拟机通过改变计数器的值来选取需要执行的字节码指令,所以它也是程序控制流的指示器,自然Java程序中的分支、循环、跳转、异常处理、线程恢复等都需要依赖这个计数器来完成。

例子,线程恢复

Java多线程是通过多个线程之间的轮流切换、分配处理器执行时间的方式实现的。在任何一个确定的时间,一个处理器都只会执行一个线程的指令。

所以,当线程切换线程后,要恢复到正确的执行位置,每个线程都需要一个计数器,各个线程互不影响,独立存储。

通过这个计数器,每个线程就能够记录它执行的位置,当线程切换后,就能直接定位到下一条正确指令的位置了

特点

  • 如果线程正在运行的是一个Java方法,这个计数器则记录的是正在执行的虚拟机字节码的地址
  • 如果正在执行的是一个本地方法,这个计数器则为空
  • 此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError异常的区域
  • 该内存区域较小,并且是运行时内存区中,被线程隔离

PS:Java方法和本地方法(Native Method)

  • Java方法:由java语言编写,编译成字节码存储在class文件中的
  • 本地方法:本地方法是由其他语言编写的,比如c、c++等,编译成和处理器相关的代码。本地方法保存在动态连接库中,格式是各个平台专用的,运行中的java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。

上面所讲的在执行本地方法的时候,程序计数器为空(undefined),本地方法不是由java语言编写的,所以编译后自然没有字节码地址这么一说了,所以程序计数器是为空的。


以上是我在学《深入理解Java虚拟机》一书的学习记录,如有错误的地方,希望大佬们能够再评论区指点指点,互相学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值