前言
一般情况下,两个栈帧之间的内存区域是独立的,但是JVM在实现过程中会进行一些优化,使两个栈帧之间共用一部分内存区域
举例说明
1. 测试代码
/**
*
* 栈帧之间数据共享
*
*/
public class StackFrameOptimized {
public static void main(String[] args) throws InterruptedException {
StackFrameOptimized stackFrameOptimized = new StackFrameOptimized();
// 1 进入操作数栈
stackFrameOptimized.add(1);
}
public int add(int a) throws InterruptedException {
// 1 存在于局部变量表中
int rt = a + 1;
Thread.sleep(Integer.MAX_VALUE);
return rt;
}
}
2. 结果分析
使用JHSDB 工具查看栈的信息(见下图)
结合测试代码及栈信息可以分析出,在main线程中有两个栈帧main和add,其中栈帧main的操作数栈与add栈帧的局部变量表是共用一部分内存区域的
总结
两个栈帧之间数据共享,主要体现在方法调用中有参数传递的情况,上一个栈帧的部分局部变量表与下一个栈帧的操作数栈共用一部分空间,这样既节约了空间,也避免了参数的复制传递