运行时数据区
JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM高效的运行。
又是这张熟悉的图,它就是JVM运行时数据区,其中方法区和堆是所有线程共享的,生命周期与JVM的生命周期一样。程序计数器和栈是线程私有的,即每一个线程都独享一份。
每一个JVM对应一个Runtime实例,称为运行时数据区。
线程
线程的概念大家都很熟悉了,jvm运行多个线程并行执行。 在HotSpot虚拟机里面,每个线程都与本地线程直接映射。 本地线程与jvm线程同时存在。
线程分为:守护线程和普通线程。
GC就是一个守护线程,不需要我们去管理,由系统自己维护。
程序计数器
PC程数计数寄存器其实就是指令计数器,它的作用是用来存放指向下一条指令的地址,也是即将要执行的指令。由执行引擎读取下一条指令。
执行引擎在后面会开博文去阐述。
两个常见问题
使用pc寄存器存储字节码指令地址有什么用?
为什么使用pc寄存器记录当前线程的执行地址?
因为CPU需要不停的切换线程,在一次上下文切换中,如果不知道指令执行在哪个地方,那么就会造成程序的崩溃,所以pc寄存器中的指令地址可以使得cpu在切换线程回到之前线程的时候可以记得当前线程执行到了哪一步。
JVM字节码解释器就通过PC寄存器的值来明确下一条指令的执行。
PC寄存器为什么是线程私有的?
很好理解啊,就是多线程在某一个特定的时间内只会执行一个方法,cpu不停的做任务切换,这样必然会导致中断和恢复。那么为了能够准确的保证方法执行到哪一步能被很好的记住,那么就需要为每一个线程分配一个单的pc寄存器,这样线程之间就会独立计算,不会互相干扰。
每个线程其实就是对应每一个方法,对应一个栈帧和一个pc。栈帧的概念,在后面栈的时候会很明确的去阐述。