虚拟机栈的简介
虚拟机栈(VM Stack)也叫Java栈、内存栈,它的作用是主管Java程序的运行, 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。虚拟机栈是在线程创建的时候创建的,因此它的生命周期就和线程的生命周期保持一致。线程一旦结束,该线程私有的栈也会释放。8种基本数据类型、对象的引用变量、实例方法都是在虚拟机栈中分配的。
栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集。虚拟机内部保存着一个个栈帧,而栈帧主要用于保存3类据:
- 本地变量(Local Variables):输入参数和输出参数以及方法内的变量
- 栈操作(Operand Stack):记录出栈、入栈的操作
- 栈帧数据(Frame Data):包括类文件、方法等
每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等与当前方法相关的信息,每一个方法从被调用到执行完毕都对应虚拟机栈中一个栈帧从入栈都出栈的过程。
虚拟机栈的大致工作原理:当方法f2被调用时会把Stack Frame2压入栈顶,而f2又调用了f1,因此Stack Frame1被压入成为新的栈顶,执行完毕后,会先弹出Stack Frame1,然后才弹出Stack Frame2。每执行一个方法就会产生一个栈帧,保存到栈(后进后出)的顶部,顶部栈就是当前执行的方法,该方法执行完毕后,会自动将此栈帧出栈。
栈溢出
栈的内存是有一定大小的,并不是无限大的,因此肯会存在栈满而导致栈溢出的情况,如下面t1和t2不断的无限制的互相调用就会出现栈溢出(StackOverflowError):
public class Test {public static void main(String[] args) {t1();}public static void t1(){t2();System.out.println("方法t1");}public static void t2(){t1();System.out.println("方法t2");}}

