《深入理解JVM虚拟机》笔记摘抄

198 阅读2分钟

结合当前正在做的事涉及到JVM相关的知识时, 查阅资料并记录, 方便以后快速查阅, 以下内容全部摘抄自《深入理解JVM虚拟机》这本书.

1. 方法调用

1.1 栈帧

  栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构, 它是虚拟机运行时数据区中的虚拟机栈的栈元素. 栈帧存储了方法的局部变量表、操作数栈、动态连接、方法返回地址等信息.

  每一个方法从调用开始至执行完成的过程, 都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程.

  在编译程序代码的时候, 栈帧中需要多大的局部变量表, 多深的操作数栈都已经完全确定了, 并且写入到方法表的Code属性中, 因此一个栈帧需要分配多少内存, 不会受到程序运行期变量数据的影响, 而仅仅取决于具体的虚拟机实现.

1.2 局部变量表

  局部变量表是一组变量值存储空间, 用于存放方法参数和方法内部定义的局部变量. 在java程序编译为class文件时, 就在方法的Code属性的max_locals数据项中确定了该方法所需要分配的局部变量表的最大容量.

1.3 操作数栈

  也称为操作栈, 它是一个后入先出栈, 同局部变量表一样, 操作数栈的最大深度也在编译的时候写入到Code属性的max_stacks数据项中.

  当一个方法刚刚开始执行的时候, 这个方法的操作数栈是空的, 在方法的执行过程中, 会有各种字节码指令往操作数栈中写入和提取内容, 也就是出栈/入栈操作.