Java面试必备知识-关于JVM程序计数器

字数 824阅读 2207

今天跟大家聊聊较为底层的东西。也是作为一个Java开发必备的知识点。JVM虚拟机的结构划分。

相比大家都背的滚瓜烂熟了。JVM虚拟机不就是:程序计数器、栈、堆、方法区吗?这读书的时候都考过了啊。有啥好说的。如果你仅仅只是知道它的名称。而不知道它的具体工作流程。应该不算你熟悉JVM虚拟机。由于每一块展开都需要很大的篇幅。我就划开一块一块的分析。今天就先解释程序计数器的工作流程。

JVM 程序计数器

在上面的图中我们可以看到程序计数器(PROGRAM COUNTER REGISTER)是JVM虚拟机的重要组成部分。虽然它画了很大一块。其实在现实中程序计数器只是一个很小很小的内存空间。你可以把它看作是当前线程所执行的字节码的行号指示器。
解释:当前现成所执行的字节码的行号指示器:程序计数器中只存储当前线程执行程序的行号,一个类指针的数据结构。

在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
我们熟悉的分支操作、循环操作、跳转、异常处理和线程恢复等基础模型都需要依赖这个计数器来完成。

多线程模型——线程私有

我们所接触的Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的。

所以在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。

因此每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。这样的现在我们称这类内存区域为"线程私有"的内存。

程序计数器执行状态

当一个线程正在执行一个Java方法的时候,这个计数器记录的是正在执行的虚拟机字节码指令的地址。
如果正在执行的是Native方法,这个计数器值则为空(Undefined)。
程序计数器主要用途就是上面的几点。大家如果有什么要补充的可以在留言中补充哦。我也会及时加上。也希望大家都能对JVM有更好的了解。

我的文章每天都会在头条号首发,然后第二天转发到简书中,希望有兴趣的朋友可以关注我的头条号:[Bug制造机]
(https://www.toutiao.com/c/user/51553105950/#mid=1582105392193550)。谢谢大家的支持。

推荐阅读更多精彩内容