JVM执行字节码指令是基于栈的架构,就是说所有的操作数都必须先入栈,然后再根据需要出栈进行操作计算,再把结果进行入栈,这个流程和基于寄存器的架构是有本质区别的,而基于寄存器架构来实现,在不同的机器上可能会无法做到完全兼容,这也是Java会选择基于栈的设计的原因之一。
我们思考下,当我们调用一个方法时,参数是怎么传递的,返回值又是怎么保存的,一个方法调用之后又是如何继续下一个方法调用的呢?调用过程中肯定会存储一些方法的参数和返回值等信息,这些信息存储在哪里呢?
我们知道,每次调用一个方法就会产生一个栈帧,所以我们肯定可以想到栈帧就存储了所有调用过程中需要使用到的数据。
栈帧
当我们调用一个方法的时候,就会产生一个栈帧,当一个方法调用完成时,它所对应的栈帧将被销毁,无论这种完成是正常的还是突然的(抛出一个未捕获的异常)。
每个栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、动态链接(Dynamic Linking)、方法返回地址(Return Address)和额外的附加信息。
在给定的线程当中,永远只有一个栈帧是活动的,所以活动的栈帧又称之为当前栈帧,而其对应的方法则称之为当前方法,定义了当前方法的类则称之为当前类。当一个方法调用结束时,其对应的栈帧也会被丢弃。
局部变量表
标签:基于,调用,架构,一个,重写,重载,方法,栈帧 From: https://www.cnblogs.com/xfeiyun/p/17245661.html