在深入学习java虚拟机之前,首先需要了解JVM的整体结构,作为整个JVM知识体系的引入,我们先从oracle官网来作为学习的切入点,从JDK8官方说明可以知悉,JVM组成结构主要包括以下几个部分
运行时数据区(Run-Time Data Areas)
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。
1.PC寄存器
Java虛拟机可以支持多条线程同时执行,每一条Java虚拟机线程都有自己的pc寄存器。在任意时刻,一条Java虚拟机线程只会执行一个方法的代码,这个正在被线程执行的方法称为该线程的当前方法。如果这个方法不是native的,那pc寄存器就保存Java虚拟机正在执行的字节码指令的地址,如果该方法是native的,那pc寄存器的值是undefined。pc寄存器的容量至少应当能保存一个returnAddress类型的数据或者一个与平台相关的本地指针的值。
2.Java虚拟机栈
每一条 Java 虚拟机线程都有自己私有的 Java 虚拟机栈,这个栈与线程同时创建,用于存储栈帧。Java 虚拟机栈的作用与传统语言(例如C语言)中的栈非常类似,用于存储局部变量与一些尚未算好的结果。另外,它在方法调用和返回中也扮演了很重要的角色。因为除了栈帧的出栈和入栈之外, Java 虚拟机栈不会再受其他因素的影响,所以栈帧可以在堆中分配,Java 虚拟机栈所使用的内存不需要保证是连续的。
在( Java 虚拟机规范)第 1 版中, Java 虚拟机找也称为“ Java 栈”。
Java 虚拟机规范既允许Java虚拟机栈被实现成固定大小,也允许根据计算动态来扩展和收缩。如果采用固定大小的Java虚拟机栈,那每一个线程的Java虚拟机栈容量可以在线程创建的时候独立选定。
Java虚拟机实现应当提供给程序员或者最终用户调节虚拟机找初始容量的手段,对于可以动态扩展和收缩Java虚拟机栈来说,则应当提供调节其最大、最小容量的手段。
Java虚拟机栈可能发生如下异常情况:
(1)、如果线程请求分配的栈