JVM规范要求虚拟机实现者自己实现栈帧,本文阐述栈帧的实现方式,有三种 1.堆上分配 2.连续重叠分配 3.混合分配 当调用一个方法的时候,JVM会根据方法信息在内存中划分一个叫做栈帧
JVM规范要求虚拟机实现者自己实现栈帧,本文阐述栈帧的实现方式,有三种
1.堆上分配
2.连续重叠分配
3.混合分配
当调用一个方法的时候,JVM会根据方法信息在内存中划分一个叫做栈帧的区域,那么具体是在哪里呢?本文以如下代码为例
public int m3() {int a=4;
int b=5;
int c=m4(a,b);
return c;
}
public int m4(int a,int b) {
return a+b;
}
1.堆上分配
调用一个方法的时候,在堆中的某个位置划分出一个区域,用作栈帧,当m3调用m4的时候,jvm需要为m4分配一块内存,这个内存是在堆中分出来的,m3栈帧使用一个指针指向m4栈帧,没错,如你所想,m3与m4不是连续的
2.连续重叠分配
和我们多数人的想法一样,栈空间是连续的,所以栈帧也是连续的,这只是其一,既然是连续的,那么将m3的操作数栈,作为m4的局部变量表,这样就更加节省内存,这也是常见的栈帧实现方式
3.混合分配
将上面两种方式混搭使用,当栈满了之后,可以采用堆上分配的方式,这样栈的可伸缩性会更好