结合当前正在做的事涉及到JVM相关的知识时, 查阅资料并记录, 方便以后快速查阅, 以下内容全部摘抄自《深入理解JVM虚拟机》这本书.
1. 方法调用
1.1 栈帧
栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构, 它是虚拟机运行时数据区中的虚拟机栈的栈元素. 栈帧存储了方法的局部变量表、操作数栈、动态连接、方法返回地址等信息.
每一个方法从调用开始至执行完成的过程, 都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程. 在编译程序代码的时候, 栈帧中需要多大的局部变量表, 多深的操作数栈都已经完全确定了, 并且写入到方法表的Code属性中, 因此一个栈帧需要分配多少内存, 不会受到程序运行期变量数据的影响, 而仅仅取决于具体的虚拟机实现.1.2 局部变量表
局部变量表是一组变量值存储空间, 用于存放方法参数和方法内部定义的局部变量. 在java程序编译为class文件时, 就在方法的Code属性的max_locals数据项中确定了该方法所需要分配的局部变量表的最大容量.
1.3 操作数栈
也称为操作栈, 它是一个后入先出栈, 同局部变量表一样, 操作数栈的最大深度也在编译的时候写入到Code属性的max_stacks数据项中.
当一个方法刚刚开始执行的时候, 这个方法的操作数栈是空的, 在方法的执行过程中, 会有各种字节码指令往操作数栈中写入和提取内容, 也就是出栈/入栈操作.