《实战Java虚拟机》学习笔记之函数调用
Contents
出入Java栈
Java栈是一块线程私有的内存空间。它是一块先进后出的数据结构。Java栈中保存的主要内容为栈帧。每一次函数调用,都会有一个对应的栈帧被压入栈,每一个函数调用结束,都会有一个栈帧被弹出Java栈。当前正在执行的函数所对应的帧就是当前的帧(位于栈顶),它保存着当前函数的局部变量、中间运算结果等数据。
Java方法有两种返回函数的方式,一种是正常的函数返回,使用return指令;另一种是抛出异常。不管使用哪种方式,都会导致栈帧被弹出。
在一个栈帧中,至少要包含局部变量表
,操作数栈
,帧数据区
几个部分。
Java栈的大小,是通过虚拟机参数-Xss
来控制大小的。
函数嵌套调用的层次,在很大程度上由栈的大小决定。栈越大,函数可以支持的嵌套调用次数越多。
局部变量表
它用于保存函数的参数及局部变量。局部变量表中的变量只在当前函数调用中有效,当函数调用结束后,随着函数栈帧的销毁,局部变量表也会随之销毁。
由于局部变量表在栈帧之中,因此,如果函数的参数和局部变量较多,会使得局部变量表膨胀,从而每一次函数调用就会占用更多的栈空间,最终导致函数的嵌套调用次数减少。
查看局部变量表的工具: jclasslib
操作数栈
操作数栈也是栈帧中重要内容之一,它主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。
帧数据区
它保存着访问常量池的指针,方便程序访问常量池。
异常处理表,也是帧数据区中重要的一部分。