出入Java栈

Java栈是一块线程私有的内存空间。它是一块先进后出的数据结构。Java栈中保存的主要内容为栈帧。每一次函数调用,都会有一个对应的栈帧被压入栈,每一个函数调用结束,都会有一个栈帧被弹出Java栈。当前正在执行的函数所对应的帧就是当前的帧(位于栈顶),它保存着当前函数的局部变量、中间运算结果等数据。

Java方法有两种返回函数的方式,一种是正常的函数返回,使用return指令;另一种是抛出异常。不管使用哪种方式,都会导致栈帧被弹出。

在一个栈帧中,至少要包含局部变量表操作数栈帧数据区几个部分。

Java栈的大小,是通过虚拟机参数-Xss来控制大小的。

函数嵌套调用的层次,在很大程度上由栈的大小决定。栈越大,函数可以支持的嵌套调用次数越多。

局部变量表

它用于保存函数的参数及局部变量。局部变量表中的变量只在当前函数调用中有效,当函数调用结束后,随着函数栈帧的销毁,局部变量表也会随之销毁。

由于局部变量表在栈帧之中,因此,如果函数的参数和局部变量较多,会使得局部变量表膨胀,从而每一次函数调用就会占用更多的栈空间,最终导致函数的嵌套调用次数减少。

查看局部变量表的工具: jclasslib

操作数栈

操作数栈也是栈帧中重要内容之一,它主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。

帧数据区

它保存着访问常量池的指针,方便程序访问常量池。

异常处理表,也是帧数据区中重要的一部分。