Skip to content

Instantly share code, notes, and snippets.

@arrayadd
Last active August 20, 2017 16:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arrayadd/85967c9ca8f231e5a4a120aa0322e379 to your computer and use it in GitHub Desktop.
Save arrayadd/85967c9ca8f231e5a4a120aa0322e379 to your computer and use it in GitHub Desktop.
【JVM】程序计数器为什么是线程私有的?

我们知道,JVM运行时数据区域中有一个线程私有的区域Program Counter Register,姑且翻译为程序计数器。 当然也有翻译为 PC寄存器的。以下简称PCR. 我们知道在计算机的CPU中有两个专有的寄存器

  • 指令寄存器,用于存储正在执行的指令
  • 程序计数器,其存储的是下一个等待执行的指令地址。

在JVM中,这两个专有寄存器功能应该是融合的(没考证,推测的,但不影响理解其功能)


为什么是线程私有的?

当在执行多线程时候,CPU会不停的切换任务(对于多核来说是一个内核),本质上在一个确定的时间点,只会执行某一个线程的指令。 那么这时候为了能够准确的记录各个线程正在执行的当前字节码指令的地址,最后的办法就是为每一个线程一人分配一个计数器, 这样一来各个线程独立计算互不干扰,虽然理论上浪费了些空间,但问题则变得简单多了。

这种类似以空间换时间(简化问题)的做法,在java中比比皆是,例如多线程中常见的ThreadLocal,CopyOnWriteArrayList

最后需要注意的是,该区域是JVM的内存区域中唯一一个没有明确规定需要抛出OutOfMemoryError异常的运行时内存区。所以见到OOME时候,别急着往 这个区域找原因。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment