学习记录286@JVM栈帧的理解

什么是栈

栈是一种数据结构,一般是用链表实现,特殊之处在于先进后出,也就是后进先出。想象一个空间,往里面依次丢节点1,2,3,最后出栈或者运行的顺序是3,2,1。

什么是JVM的栈和栈帧

类似与栈的数据结构,JVM的栈是一块内存区间,用于调用和执行Java中的方法,调用的过程就是入栈,执行的过程就是出栈,一次完整的方法执行就是入栈和出栈的过程,也就是调用和执行的过程。
注意如果是在调用一个方法的时候,嵌套了另外一个方法,这个时候,就会入栈两个方法,而且是按照先进后出的原则执行的,这在递归中表现得尤其明显。

JVM的栈和栈帧图解

见以下代码的图解:
注意在调用一个方法的时候,嵌套了另外一个方法,这个时候,就会入栈两个方法,而且是按照先进后出的原则执行的,如果是一般的分别用对象调用方法,则等第一个方法执行完,第二个方法才执行,不会出现这个先进后出的情况,另外不同的类会开辟不同栈空间,各自执行自己的方法。

package mypackage;

class StackFrame{
    
    
    public void m1(){
    
    
        m2();
        System.out.println("我是第1个方法,但是我在栈的最底层,我最后执行");
    }

    public void m2(){
    
    
        m3();
        System.out.println("我是第2个方法,但是我在栈的倒数第二层,我倒数第二层执行");
    }

    public void m3(){
    
    
        System.out.println("我是第3个方法,但是我在栈顶,我最先执行");
    }
}


//测试
public class MyJava {
    
    

    public static void main(String[] args) {
    
    
        StackFrame stackFrame = new StackFrame();
        stackFrame.m1();
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意以上是方法内调用了方法,才出现了先进后出的情况,如果是一般的分别用对象调用方法,则等第一个方法执行完,第二个方法才执行,不会出现这个先进后出的情况,另外不同的类会开辟不同栈空间,各自执行自己的方法。

JVM的栈和栈帧debug

为了更明显的看到执行的过程我们使用debug。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后看一下依次执行的结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44663675/article/details/107014923