JVM之程序计数器

JVM运行时数据区的图,从这个图能清楚程序计数器的位置

线程私有的,生命周期与线程相同

什么是程序计数器?

通俗的讲就是告诉当前线程该执行哪条字节码了。

周志明定义

可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器的工作就是通过改变程序计数器的值来选择下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖这个计数器来完成。

程序计数器存在哪?

虚拟机区别于硬件,组成原理里学的程序计数器是用CS和IP寄存器来存,来表示指令地址。
而Java把程序计数器存在内存里。

程序计数器保存内容?

两种情况:
一、存的是Java字节码的地址,实现上可能有两种形式:
1.是相对该方法字节码开始处的偏移量,叫做bytecode index,简称bci;
2.是该Java字节码指令在内存里的地址,叫做bytecode pointer,简称bcp。

二、为空(Undefined)
如果调用的是Native方法

程序计数器有啥作用?

现实中程序往往是多线程协作完成任务的。JVM的多线程是通过CPU时间片轮转来实现的,某个线程在执行的过程中可能会因为时间片耗尽而挂起。当它再次获取时间片时,需要从挂起的地方继续执行。在JVM中,通过程序计数器来记录程序的字节码执行位置。程序计数器具有线程隔离性,每个线程拥有自己的程序计数器

异常

此区域一般不会发生OutOfMemoryError,如果发生此类异常,排查的时候先别着急找这块了。

拓展

是跟操作系统中的程序计数器有点类似。这个有时间再补充吧。

参考

独立博客不易,打赏是最好的鼓励~~