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方法出栈,此时程序运行完。