运行时数据区
从类加载器过去以后就是运行时数据区,包括堆、方法区、本地方法栈等结构,执行引擎蛀牙负责操作并管理运行时数据区。一整个JVM当中只有一个运行时数据区,就是一个RunTime实例。
采用比喻的方式就是如下图:
堆、方法区等就是材料工具 是共享的
执行引擎就是厨师 是非共享的,每个线程有自己的一部分程序计数器、虚拟机栈和本地方法区,也就是红色区域是共享的,灰色区域可以有任意个。
操作台就是栈
以及负责回垃圾的GC,(守护线程,运行在后台)
运行时数据区具体组成
元数据区和JIT编译产物合称为方法去,也称为非堆区。
开始学习 - 程序计数器/PC寄存器
特点:
- 占用内存极小
- 每条线程一份,生命周期和当前线程一致。
- 每一个时间之后有一个方法在执行,如果是java方法,就会储存当前正在执行的java方法的JVM指令地址,如果是native方法,就是undifined.
- 占用内存不会溢出,且GC回收器也不会处理。
举例:
pc寄存器:
指令地址保存在PC寄存器当中,执行引擎会通过PC寄存器当中的地址执行相应的指令,操作变量或者其他。
使用PC寄存器存储指令地址有什么用?
1.因为CPU在不停的切换线程执行,若果不使用PC寄存器存储指令地址,再起执行时无法继续执行。
2.PC寄存器当中储存的是所有指令的地址,当执行完当前指令,后面执行什么指令就保存在PC寄存器当中。
PC寄存器为什么不像堆内存一样线程共享?
因为每个线程都可以准确执行所有字节码指令,防止发生冲突或异常。