202108111240 - JVM栈帧

每个线程都有一个方法栈,
该栈中,每个方法对应一个栈帧
https://www.cnblogs.com/jhxxb/p/11001238.html

每个栈帧中包含

  • 局部变量表(Local Variable Table)
    • 在编译程序代码的时候就可以确定栈帧中需要多大的局部变量表,具体大小可在编译后的 Class 文件中看到。
    • 局部变量表的容量以 Variable Slot(变量槽)为最小单位,每个变量槽都可以存储 32 位长度的内存空间。
    • 在方法执行时,虚拟机使用局部变量表完成参数值到参数变量列表的传递过程的,如果执行的是实例方法,那局部变量表中第 0 位索引的 Slot 默认是用于传递方法所属对象实例的引用(在方法中可以通过关键字 this 来访问到这个隐含的参数)。
    • 其余参数则按照参数表顺序排列,占用从 1 开始的局部变量 Slot。
    • 基本类型数据以及引用和 returnAddress(返回地址)占用一个变量槽,long 和 double 需要两个。
  • 操作数栈(Operand Stack)
    • 同样也可以在编译期确定大小。
    • Frame 被创建时,操作栈是空的。操作栈的每个项可以存放 JVM 的各种类型数据,其中 long 和 double 类型(64位数据)占用两个栈深。
    • 方法执行的过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈和入栈操作(与 Java 栈中栈帧操作类似)。
    • 操作栈调用其它有返回结果的方法时,会把结果 push 到栈上(通过操作数栈来进行参数传递)。
  • 动态链接(Dynamic Linking)
    • 每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接。
    • 类加载阶段中的解析阶段会将符号引用转为直接引用,这种转化也称为静态解析。另外的一部分将在运行时转化为直接引用,这部分称为动态链接。
  • 返回地址(Return Address)
    方法开始执行后,只有 2 种方式可以退出 :方法返回指令,异常退出。
  • 帧数据区(Stack Data)
posted @ 2025-03-20 18:34  钱塘江畔  阅读(19)  评论(0)    收藏  举报