JVM 之栈结构

JVM中三块主要的内存就是:栈内存,堆内存,方法区内存
方法区最先有数据:方法区中存放的是代码片段,存放class字节码
栈内存:方法调用的时候,该方法需要的内存空间在栈中分配,并且调用时就是压栈。方法不调用是不会再栈中分配空间的,,方法执行结束后,该方法所需要的空间就会释放,此时发生弹栈动作。
方法调用叫做:压栈,分配空间
方法结束叫做:弹栈,出栈,释放空间
栈中存储什么?方法运行过程中需要的内存,以及栈中会存储方法的局部变量

栈的形状是露出一边,从露出的这一边进去,也是从这一边出来。所以说,栈的特点是“先进后出”或者“后进先出”。

如下图:

栈帧永远指向的是栈顶元素,栈顶元素具有活跃权。

数据data1先进入栈低,然后数据data2再进入,数据data3最后进去。

出的时候数据data3先出,然后数据data2再出,数据data1最后出栈。

public class Stack {
    public static void main(String[] args) {
        System.out.println("main begin");
        int x = 100;
        m1(x);
        System.out.println("main over");

    }

    public static void m1(int i){
        System.out.println("m1 begin");
        m2(i);
        System.out.println("m1 over");
    }

    public static void m2(int i){
        System.out.println("m2 begin");
        m3(i);
        System.out.println("m2 over");
    }

    public static void m3(int i){
        System.out.println("m3 begin");
        System.out.println(i);
        System.out.println("m3 over");
    }
}
结果:
main begin m1 begin m2 begin m3 begin
100 m3 over m2 over m1 over main over

运行是占用内存情况:1.首先main方法进栈,在main里面调用m1,运行到m1那行代码就停止,然后给m1方法分配内存空间.。因为在m1方法中调用了m2方法,运行至调用m2方法时停止,然后给m2方法分配内存空间,因为在m2方法中调用了m3方法,那么运行至m3方法时给m3方法分配内存空间。如下图所示:这时m3方法是栈帧,执行完over时,整个方法运行结束,m3方法出栈。接下来栈帧指向m2方法,m2输出over,运行完,出栈。然后栈帧指向m1方法,m1输出over,运行完,m1出栈。栈帧指向main方法,然后输出over,main方法出栈,此时程序运行完。

 

 

 

原文地址:https://www.cnblogs.com/peiminer/p/13589146.html