调整虚拟机栈的大小的参数 -Xss
栈的结构
栈有一个个栈帧组成
|–栈
|—-|–栈帧
|—-|—-|–局部变量表
|—-|—-|–操作数栈
|—-|—-|–方法返回地址
|—-|—-|–动态链接
|—-|—-|–一些附加信息
如图:
局部变量表
- 也被称为局表变量数组或本地变量表,是一个数字数组。
- 记录基本数据类型和对象的引用和返回值类型。
- 局部变量表的大小在编译器就被确定不会改变。
- 基本存储单元:slot(变量槽)
- 32位以内的类型只占用一个槽,64位(long、double)占用两个槽
- 实例方法中局部变量表的首位存放this
- 注意solt重复利用的问题
- 局部变量表中的变量也是重要的垃圾回收根节点,只要被局部
- 变量表中直接或间接引用的对象都不会被回收。
操作数栈
- 主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间
- 方法刚执行的时候,一个新的栈帧会被创建,这个方法的操作数栈是空的
- 如果调用的方法带有返回值,返回值会被压入当前栈帧的操作数栈
- 操作数栈有明确的长度,为方法的code属性中的max_stack的值
- 操作数栈并非采用索引的方式来进行数据访问
- JVM的解释引擎是基于栈的执行引擎,其中的栈指的是操作数栈
动态链接(指向运行时常量池的方法引用)
- 每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。
- 在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用保存在class文件的常量池里。
- 动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。
方法调用(提出去)
方法返回地址
- 存储该方法PC寄存器的值
- 一个方法的结束有两种方式
- 正常执行结束
- 出现未处理异常,非正常退出
- 无论通过哪种方式退出,在方法退出后都会返回该方法被调用的位置。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存着部分信息。
一些附加信息
- 栈帧中还允许携带与Java虚拟机实现相关的一些附加信息。例如对程序调试提供支持的信息。
- 其中方法返回地址、动态链接、一些附加信息称为帧数据区