JVM—【01】认识JVM的内存布局和运行时数据区

  • 栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法返回地址等信息。

    局部变量表:存放方法参数,编译期可知的基本数据类型、对象引用类型(reference)和returnAddress类型(指向一条字节码指令地址)。局部变量表所需的内存空间是在编译期确定,方法在局部变量表中分配多少空间是完全确定的。在运行期间不会改变局部变量表的大小。局部变量没有准备阶段,必须显示初始化。

    操作栈是一个初始状态为空的桶式结构栈。方法执行过程中,会有各种指令往栈写入和提取信息。JVM的执行引擎就是基于操作栈的执行引擎。

    动态连接: 在Class文件中的常量持中存有大量的符号引用。字节码中的方法调用指令就以常量池中指向方法的符号引用作为参数。这些符号引用一部分在类的 加载阶段 或第一次使用的时候就转化为了直接引用,称为静态链接。而相反的,另一部分在 运行期间 转化为直接引用,就称为 动态链接

    方法返回地址:方法执行时有两种退出情况:一是正常退出,正常执行到方法的返回字节码指令;二是异常退出。两种退出都会返回当前被调用的位置。方法退出相当于弹出当前栈帧,退出的方式有三种: 1. 返回值压入上层调用栈帧。 2. 异常信息抛给能够处理的栈帧。 3. PC计数器指向方法调用后的下一条指令。