JVM_1.8_通过递归代码,来看Java虚拟机栈

前两天在看Lua,看到一个Demo,是个递归,当时脑子看的有点懵逼...没想出来是怎么回事...

然后我用Java写了一下(还是java代码熟悉一点)

public static void main(String[] args) {
    int number = 3;
    System.out.println(fact(number));;
}

private static int fact(int number) {
    if (number == 0) {
        return 1;
    } else {
        int num = fact(number - 1);
        return number * num;
    }
}

通过运行上面的代码或者目测,可以发现,递归fact()往下一共四层,

看IDEA 的bebug信息,main主线程的Java虚拟机栈中,有四个栈帧。

查看 Frames中四个栈帧,发现number分别(4-1)是:0、1、2、3

当number=0时,递归结束,Java虚拟机栈 入栈到底。

 

还记得之前学习过 Java虚拟机栈和栈帧嘛?

每一个方法从调用开始到执行完成的过程,就对应着一个栈帧在Java虚拟机栈中,从入栈到出栈的过程

这里方法执行的是递归,通过IDEA Frames可看到,一共四层栈帧;

形象一点,如下图,每一个小块都是一个栈帧,对应着都是一个fact方法!

当递归结束的时候,对于执行引擎的当前线程来说,只有在栈顶的栈帧是有效的,称为当前栈帧

也就是说当前栈帧是4号栈帧。

之前说过,上面4个栈帧,就是执行4次fact()方法

跟着代码,继续往下走:

private static int fact(int number) {
    if (number == 0) {
        return 1;
    } else {
        int num = fact(number - 1);
        return number * num;
    }
}

4号栈帧的number为0,if分支直接return 1,这里出栈了。

 

3号栈帧中

number = 1

int num = fact(number - 1),返回结果是1,所以num=1;

执行操作数栈 number * num,结果是1 ,然后return,3号栈帧出栈。

 

2号栈帧中

number = 2

int num = fact(number - 1),返回结果是1,所以num=1;

执行操作数栈 number * num,结果是2,然后return,2号栈帧出栈。

 

1号栈帧中

number = 3;

int num = fact(number -1),返回结果是2,所以num=2;

执行操作数栈 number * num ,结果是6。

最后计算完成。

 

通过下面的图例,来看下这个过程

 

以上就是粗略的分析,如有错误,希望指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值