[Java]栈 虚拟机栈 栈帧讲解
1. 栈(Stack)
-
基本概念:栈是一种**后进先出(LIFO)的线性数据结构,支持两种操作:压栈(push)和弹栈(pop)。
-
在计算机中的作用:
-
存储函数/方法的调用链。
-
保存局部变量、方法参数、返回值等临时数据。
-
是线程私有的内存区域,生命周期与线程绑定。
-
2. 虚拟机栈(JVM Stack)
-
定义:虚拟机栈是JVM为每个线程分配的一块内存区域,用于支持Java方法的执行。每个线程在创建时都会分配一个独立的虚拟机栈。
-
核心作用:
-
存储方法调用的栈帧(Stack Frame)。
-
管理方法调用中的局部变量、操作数、动态链接和返回地址。
-
-
关键特性:
-
线程私有:不同线程的虚拟机栈互不干扰。
-
栈大小可配置:通过JVM参数
-Xss
设置(如-Xss256k
)。若栈深度超过限制(如无限递归),会抛出StackOverflowError
。 -
生命周期:与线程相同,线程结束时虚拟机栈被回收。
-
3. 栈帧(Stack Frame)
-
定义:每个Java方法执行时,JVM会在虚拟机栈中创建一个栈帧。方法从调用到执行完成对应栈帧的入栈到出栈。
栈帧的组成:
组成部分 | 作用 |
---|---|
局部变量表 | 存储方法参数和局部变量,以变量槽(Slot)为单位。非静态方法的第0位Slot存放 this 。 |
操作数栈 | 存放执行字节码指令所需的操作数(如算术运算的中间结果)。 |
动态链接 | 指向运行时常量池的引用,支持方法调用时的动态绑定(如多态)。 |
方法返回地址 | 方法退出时返回到调用者的位置(程序计数器值或异常处理表地址)。 |
附加信息 | 调试信息、性能监控数据等(JVM实现相关)。 |
栈帧的工作流程:
- 方法调用:新栈帧压入虚拟机栈。
- 方法执行:操作数栈处理字节码指令,局部变量表读写数据。
- 方法返回:栈帧弹出,恢复调用者的栈帧,根据返回地址继续执行。
总结
- 栈是后进先出的数据结构。
- 虚拟机栈是线程私有的内存区域,管理Java方法调用。
- 栈帧是方法执行的基础单元,包含局部变量、操作数等关键信息。