在一般的模型中,两个不同的栈帧的内存区域时独立的,但是大部分的JVM在实现中会进行一些优化,使得两个栈帧出现一部分的重叠。(主要体现在方法中参数传递的情况下),让下面栈帧的操作数栈和上面栈帧的部分局部变量重叠在一起,这样做不但节约一部分空间,更重要的是进行方法调用时可以直接共用一部分数据,无需进行额外的时间、空间进行参数的赋值传递了。

 

使用 JHSDB 工具查看栈空间一样可以看到

(工具使用查看这篇博客:http://wangchunlong.cn/article/27 ,这个工具作为Java程序员必须要掌握

测试代码:

/**
 * @author wangchl
 * 
 * JVM对栈帧空间的优化
 *
 **/
public class JVMStack {

    public int work(int x) throws Exception{
        int z =(x+5)*10;//局部变量表有, 32位
        Thread.sleep(Integer.MAX_VALUE);
        return  z;
    }
    public static void main(String[] args)throws Exception {
        JVMStack jvmStack = new JVMStack();
        jvmStack.work(10);//10  放入main栈帧  10 ->操作数栈
    }
}

 

JHSDB 查看内存信息

 

 

 

 

 

 

 

 

 

 

最后修改于 2020-07-20 17:35:04
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇