针对JVM虚拟栈 和栈帧的操做java
虚拟机栈:this
栈元素是栈帧。方法调用,栈帧入栈,反之出栈。blog
栈帧:一个方法的运行空间。虚拟机
一、局部变量表:方法定义的局部变量、方法的参数存在该表。class
实例方法中有个隐含参数“this”,因此实例方法能够访问该类的实例变量和其余实例方法。变量
局部变量表中变量的存放顺序:this(若是是实例方法)=>参数(若是有)=> 定义的局部变量(若是有)搜索
slot是局部变量表中的空间单元,虚拟机规范规定:引用
一、32位以内的数据,用一个slot来存放,如int、short、float等;float
二、64位的数据用连续两个slot来存放,如long、double;三、引用类型可32位亦可64位。方法
二、操做数栈:用来存放操做数。
局部变量表中的变量是不可直接使用的,如需使用必须经过相关指令将其加载至操做数栈中做为操做数使用。
三、方法返回地址:
一个方法开始执行后,只有两种方式能够退出这个方法。
第一种:执行引擎遇到任意一个方法返回的字节码指令,这时候可能会有返回值传递给上层的方法调用者,是否有返回值和返回值的类型将根据遇到的何种方法返回指令来决定,这种退出的方式称为正常完成出口。
另外一种:方法执行过程当中遇到了异常,而且这个异常没有在方法体内获得处理,不管是Java虚拟机内部产生的异常,仍是代码中使用athrow字节指令产生的异常,只要在本方法的异常表中没有搜索到匹配的异常处理器,就会致使方法退出,
这种退出称为异常完成出口。
根据下面的代码 模拟java虚拟机栈 栈帧的入栈 和出栈操做
public class Test { public static void main(String[] args) { new Test().a(); } public void a(){ b(); System.out.println("执行a方法结束"); } public void b(){ c(); System.out.println("执行b方法结束"); } public void c(){ System.out.println("执行C方法结束"); } }