jvm虚拟机栈的学习

虚拟机栈
作用:主要用于方法的执行。
(1)线程私有的,它的生命周期与线程相同,每个线程都有一个。
(2)每个线程创建的同时会创建一个JVM栈,JVM栈中每个栈帧存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:
boolean、char、byte、short、int、long、float、double;和对象引用(reference 32 位以内的数据类型,具体根据JVM位数(64为还是32位)有关,因为一个solt(槽)占用32位的内存空间 ,64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的基本类型只占用1个)、部分的返回结果,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址;
(3)每一个方法从被调用直至执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
(4)虚拟机栈空间可以动态扩展,当动态扩展是无法申请到足够的空间时,抛出OutOfMemory异常。
(5)虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程
(6)栈运行原理:栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧F1,并被压入到栈中,A方法又调用了B方法,于是产生栈帧F2也被压入栈,B方法又调用了C方法,于是产生栈帧F3也被压入栈…… 依次执行完毕后,先弹出后进…F3栈帧,再弹出F2栈帧,再弹出F1栈帧。见下图
jvm虚拟机栈的学习

上图表示的就是一个线程的虚拟机栈的组成结构,由很多方法栈帧组成,每个栈帧又分为局部变量,操作数帧等几部分组成。
执行过程就是先执行main方法,main方法被压入栈底,main方法又调用method1()方法,method1由调用method2,以次类推,当最上面的方法执行完了就弹出栈。这也就是我们常说的栈是先进后出的方式,也就是桶状模型。
(6)对上图中的动态链接解释下,比如当出现main方法需要调用method1()方法的时候,操作指令就会触动这个动态链接就会到方法区中找method1(),然后把method1()方法压入虚拟机栈中,执行method1栈帧的指令;此外如果指令表示的代码是个常量,这也是个动态链接,也会到方法区中的运行时常量池找到类加载时就专门存放变量的运行时常量池的数据。