我们知道,JVM运行时数据区域中有一个线程私有的区域Program Counter Register,姑且翻译为程序计数器。 当然也有翻译为 PC寄存器的。以下简称PCR. 我们知道在计算机的CPU中有两个专有的寄存器
- 指令寄存器,用于存储正在执行的指令
- 程序计数器,其存储的是下一个等待执行的指令地址。
在JVM中,这两个专有寄存器功能应该是融合的(没考证,推测的,但不影响理解其功能)
当在执行多线程时候,CPU会不停的切换任务(对于多核来说是一个内核),本质上在一个确定的时间点,只会执行某一个线程的指令。 那么这时候为了能够准确的记录各个线程正在执行的当前字节码指令的地址,最后的办法就是为每一个线程一人分配一个计数器, 这样一来各个线程独立计算互不干扰,虽然理论上浪费了些空间,但问题则变得简单多了。
这种类似以空间换时间(简化问题)的做法,在java中比比皆是,例如多线程中常见的ThreadLocal,CopyOnWriteArrayList。
最后需要注意的是,该区域是JVM的内存区域中唯一一个没有明确规定需要抛出OutOfMemoryError异常的运行时内存区。所以见到OOME时候,别急着往 这个区域找原因。