栈的基本单位是栈帧,栈帧由局部变量表,操作数栈,动态链接和返回地址组成。
首先是Java栈中的局部变量表,局部变量表包括函数的参数和局部变量,在函数范围内,这些书存在,函数运行完之后,gc堆会将变量删除,减轻内存负担。
例如:
public class Test1 {
public int add(int a, int b) {
int c = a + b;
return c;
}
}
每次循环之后,函数进行后,Java会自动清除局部变量,节省空间。
局部变量的基本储存单位是slot,在32位机器中是4byte。如果局部变量被使用完之后,会被新的变量覆盖。
其次,操作数栈:
栈的任务执行顺序是先进后出,后进先出。操作数栈中保存了方法执行过程中各指令的操作数。
然后是动态链接:
官网解释:
(Each frame (§2.6) contains a reference to the run-time constant pool (§2.5.5) for the type of the current method to support dynamic linking of the method code.)
每个栈帧都包含一个对当前方法类型的运行时常量池的引用,以支持方法代码的动态链接。(是对常量池的引用)
当方法A入栈后,帧数据区中的动态链接会持有对当前方法所属类的常量池的引用,当A中调用了方法B(符号引用),就可以通过常量池查找到具体的直接引用(方法地址)。
运行时常量池:包含几种变量,从编译时已知的数值文本到运行时必须解析的方法和字段引用。运行时常量池的功能类似于传统编程语言的符号表。查表可找到对应的数据信息。