运行时数据区
内部结构:
其中有些是随着虚拟机的启动而创建,随着虚拟机退出而销毁。还有一些是与线程相对应的,随着线程的开始与结束而创建或销毁。
程序计数器、虚拟机栈、本地方法栈
都属于每个线程私有的
方法区、堆
是属于多个线程共享
程序计数器
PC寄存器(Program Counter Register)中,寄存器存储指令相关的现场信息。
作用
1.程序计数器用来存储指向下一条指令的地址,即将要执行的指令代码。【由执行引擎读取下一条指令】
程序计数器是一个占用小的内存空间,也是运行速度最快的存储区域。
[注:每个线程都有它专属的程序计数器,生命舟曲与线程周期保持一致。]
2.任何时间一个线程都只有一个方法在执行,即当前方法
。程序计数器会存储当前线程正在执行的Java方法的JVM地址。若是在执行native方法,则存储未指定值。
3.程序计数器还是程序控制流的指示器,一些基础功能【分支、循环、跳转、异常处理、线程恢复等】都需要依赖程序计数器完成。
字节码解释器工作 便是 通过改变这个计数器的指来选取下一条需要执行的字节码指令
它是唯一在JVM中没有归档OOM(OutOfMemoryError)情况的区域
思索的两个问题:
1.使用PC寄存器存储字节码指令地址有什么用?且为何使用程序计数器来记录呢?
由于CPU需要不停地切换各个线程,当从其他线程归来时,需要明确从哪儿继续执行。
因此JVM字节码解释器便通过改变程序计数器地值来明确下一条应该执行哪里的字节码指令。
2.PC寄存器为什么会被设定线程私有?
多线程环境下,一个时间只会执行一个线程方法,因此CPU会不断地任务切换。
这样便会导致中断 或者 归来时恢复执行。为了保证正确地执行,因此需要记录各个线程正在执行的当前字节码指令地址。
故而每个线程都分配一个程序计数器,则各个线程之间便可以独立计算,不会出现互相影响的情况。