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