剑指JVM:虚拟机实践与性能调优
上QQ阅读APP看书,第一时间看更新

3.3 程序计数器常见问题

(1)使用程序计数器存储字节码指令地址有什么用?为什么使用程序计数器记录当前线程的执行地址?

因为CPU需要不停地切换各个线程,切换回来以后,就需要知道接着从哪里开始继续执行。JVM的字节码解释器通过改变程序计数器的值,来明确下一条应该执行什么样的字节码指令。

(2)程序计数器为什么会被设定为线程私有?

CPU时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片。在宏观上,我们可以同时打开多个应用程序,每个程序同时运行。但在微观上,由于只有一个CPU,一次只能处理程序要求的一部分,为了处理公平,就要引入时间片,每个程序轮流执行,如图3-5所示。

所谓的多线程是在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个程序计数器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。如图3-6所示,线程1、线程2和线程3分别由不同的程序计数器记录,假如当前程序执行的位置分别是5、7和17,这样当CPU做任务切换的时候,每个线程都有自己的记录,就可以有条不紊地恢复。

图3-5 CPU轮流执行多线程

图3-6 程序计数器在线程中的作用