程序计数器
它记录了程序执行字节码的行号和指令,字节码解释器的工作就是改变程序计数器的值,切换下一条须要执行的指令(分支,循环,跳转,异样等)。java虚拟机是多线程通过轮流切换CPU工夫片的形式实现,在同一时间内,CPU只会执行一个线程中的一个指令,为了每次切换回来都能到正确的执行地位,每个线程都会有一个独立的线程计数器,每个计数器不会相互影响,并且是线程公有的。因为不是开发者操作,所以是不会产生异样的。
虚拟机栈
虚拟机栈也是线程公有的,它的申明周期与线程一样(和线程同生死)。如果线程申请栈的深度大于虚拟机所容许的深度则会报错StackOverFlow
的谬误。如果虚拟机能够动静扩大,如果扩大后无奈取得到内存,就会报错OutOfMemoryError
。java虚拟机栈形容的是Java办法执行的内存模型,每个办法执行的同时都会创立一个栈帧,对于咱们来说次要关注栈内存,也是办法内的局部变量。
栈帧
栈帧虚拟机进行办法调用和办法执行的数据结构,它是虚拟机运行时数据区虚拟机栈的栈元素。栈帧存储了办法的局部变量表,操作数栈,动静链接和办法返回地址信息。在程序编译期,栈帧须要多大的局部变量表内存,多深的操作数栈曾经确定。在流动线程中,栈顶的栈帧才是无效的,与这个栈帧关联的形式是以后办法,执行引擎运行的所有字节码指令都只会作用于以后栈帧。
本地办法栈
本地办法栈和虚拟机栈施展的作用根本一样。区别是:本地办法栈执行的是Native办法服务,而虚拟机栈执行的是java办法。在HotSpot vm中本地办法栈和虚拟机栈合二为一。
留神:
当一个线程调用本地办法时,就会进入了一个不受java虚拟机限度的世界,它和虚拟机有着同样的权限。本地办法能够通过本地接口拜访虚拟机运行时数据区。它能够间接应用本地处理器的寄存器。并不是所有的JVM都反对本地办法。如果JVM产品不打算反对Native办法,也能够不必实现本地办法栈。