运行时数据区
红色部分代表一个进程一份(和虚拟机生命周期相同),而灰色的代表一个线程一份。
1.假设有5组线程,那么就有5组程序计数器、本地方法栈和虚拟机栈,这5组线程共享方法区和堆空间。
2.Java8以后改方法去叫做元数据区,使用的是本地内存。
1.在Hotspot JVM里, 每个线程都与操作系统的本地线程直接映射。当一个Java线程准备好执行以后,此时一个操作系统的本地线程也同时创建。Java线程执行终止后,本地线程也会回收。
2.操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程中的run()方法。、
3.如果只剩下一个守护线程,那么就可以关闭虚拟机了。
PC寄存器
-
它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。
-
在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一-致。
-
任何时间- -个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址;或者,如果是在执行native方法,则是未指定值(undefned)。
既没有GC,也没有OOM的问题
个人理解:就是告诉虚拟机,将要执行一个什么动作,切换回此线程时,知道从哪里开始执行。
实例:
编译上面的实例程序,反编译class文件,得到main部分的编译代码如下:
左边的数字就是指令地址(也叫偏移地址)就是pc寄存器所存储的东西。右边的就是操作指令。
重点理解下图:
关于寄存器的两个问题:
理解:就是说假如有两条线程,第一个线程执行了一半,然后CPU切换执行了另一线程,这个线程执行完成以后就需要回到第一个线程,pc寄存器的目的就是记录第一个线程执行到哪里了,一遍回来接着执行。