运行时数据区
- JVM定义了若干程序运行时会使用运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出销毁。有一些则是与线程绑定,与线程对应的数据区会随着线程的生命周期
- 每个线程共有的有Heap 和Method Area 私有的每个线程一份的有PC register,Virtual Machine Stack , Native Method Stack
- 后台系统线程在Hot Spot虚拟机中主要有以下几个
- 虚拟机线程 线程操作的是需要JVM达到安全点才会出现.这些操作必须在不同的线程中发生的原因是他们都需要JVM达到安全点,这样堆才不会变化.这种线程执行类型包括 stop-the-world的垃圾收集,线程收集,线程挂起,偏向锁撤销
- 周期性任务线程 时间周期事件的体现(比如中断),他们一般用于周期性操作的调度执行
- GC线程 这种线程对JVM里不同种类的垃圾收集行为提供了支持
- 编译线程 在运行时将字节码编译成本地代码
- 信号调度线程 收到信号并发送给JVM 内部通过调用适当的方法进行处理
PC寄存器 Program Counter Register
-
JVM的PC寄存器是对物理PC寄存器的一种抽象模拟,主要用于记录当前线程执行到哪个位置
-
他是一块很小的内存空间,几乎可以忽略不计,也是运行速度最快的存储区域
-
JVM规范中,每个线程都有自己的PC寄存器,是线程私有的,生命周期与线程生命周期一致
-
任何时间一个线程都只有一个方法在执行,也就是当前方法, PC寄存器会存储当前线程正在执行的方法的JVM指令地址 如果执行的是本地native方法则是undefine
-
他是程序控制流的指示器,分支,循环,跳转,异常处理,线程恢复等基础功能都依赖PC寄存器.字节码解释器工作就是通过改变这个计数器的值来选取吓一跳需要执行的字节码指令
-
他是唯一一个在JVM规范中没有任何OutOfMemoryError情况的区域
-
作用用来存储下一条指令的地址,也是即将要执行的指令代码,由执行引擎读取下一条指令
-
使用PC寄存器存储字节码指令地址有什么用?
- 因为CPU不断的切换各个线程,切换回来的时候,需要知道接着从哪里开始执行
- JVM字节码解释器就是通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令
-
PC寄存器为什么设定为私有?
- 多线程在特定的时间段只会执行其中某一个线程的方法,CPU会不断的切换任务,这样必然会导致经常中断和恢复,为了准确的记录各个线程正在执行的当前字节码指令地址,为每一个线程分配一个PC寄存器,每个线程之间独立计算,从而不会出现互相干扰情况
- 由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或者多核处理器的一个内核,只会执行一个线程中的一条指令
- 每个线程创建之后都会自己维护一个独立的PC寄存器和栈帧