JVM运行时数据区-程序计数器篇

JVM运行时数据库包括5个区域,分别是:程序计数器、Java虚拟栈、本地方法栈、堆、方法区(JDK1.8之前,1.8之后叫元数据区)

程序计数器
  • 它是一块很小的内存空间。
  • 它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
  • Java多线程是通过多线程轮流切换并分配处理器的执行时间方式来实现的。在一个确定的时间,一个处理器(对于多核处理器来说是一个内核)只会执行一条指令。那Java虚拟机是如何记住上一个线程处理的位置呢?每个线程都有一个程序计数器,当某个线程执行一个Java方法时,计数器记录的是当前虚拟机字节码指令地址;如果是Native方法,则计数器存储的是空(Undefined)。这是Java虚拟机中唯一一个不会发生OOM情况的区域。
  1. 提问,如果在执行本地方法时,切换到另一个线程,之后怎么寻找该计数器?
  2. 答案:引自知乎R大解释
    1. image-20210425222826167!halo
    2. image-20210425222920640!halo
追加 既然是多线程,那多线程之间为什么互不影响?因为程序计数器中各个计数器之间相互不影响,独立存储。这类内存也被称为线程私有的内存。

Q.E.D.


一个热爱生活的95后精神小伙