美文网首页
《深入理解Java虚拟机》笔记--栈帧

《深入理解Java虚拟机》笔记--栈帧

作者: Android_17 | 来源:发表于2019-10-20 21:56 被阅读0次

    栈帧

    是一种数据结构,用于支持方法调用和方法执行。

    • 存储了方法的局部变量表、操作数栈、动态链接、方法返回信息
    • 每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈道出栈的过程
    • 一个栈帧需要分配多少内存,不会受道程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现
    • 在活动线程中,只有位于栈顶的栈帧才是有效的,成为当前栈帧,与这个栈帧相关联的方法称为当前方法。执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。

    局部变量表

    是一组变量值存储空间,用于存放方法参数和方法内定义的局部变量。

    • 不和类变量存在“准备阶段”。类变量有两次赋值,一次是在准备阶段,赋予系统初始值,一次是在初始化阶段,赋予程序员定义的初始值。因此在初始化阶段程序员没有为类变量赋值也没关系,类变量仍然具有一个确定的初始值。但局部变量不一样,如果局部变量定义了但是没有赋初始值,是不能使用的
    • 不要认为Java中任何情况下都存在诸如整型变量默认为0,布尔类型变量默认值为false等着用的初始值

    操作数栈

    也称为操作栈,后入先出(那不就是先入后出吗)

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

    动态链接

    每个栈帧都包含有一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接。

    方法返回地址

    一个方法执行后,只有两种方法退出,一种是遇到任何一个方法返回的字节码指令,另一种是执行过程中遇到了异常。(没有返回值的咋算?返回空也算是返回没)

    • 方法退出后需要返回到方法被调用的位置,程序才能继续执行,方法返回时可能需要在栈帧中保存一些信息,用来帮助恢复她的上层方法执行状态。一般来说,方法正常退出时,调用者的PC计算器的值可以作为方法地址,栈帧中可能会保存这个计数器的值。而方法异常退出,返回地址是要通过异常处理器表来确定的,栈帧中一般不会保存这个信息
    • 方法退出的过程实际就等同于把当前栈帧出栈,因此退出时可能执行的操作有:恢复上层的局部变量表和操作数栈,把返回值(如果有的话)压入调用者栈帧的操作栈中,跳转PC计数器的值以指向方法调用指令后面的一条指令等。

    附加信息

    虚拟机规范运行具体的虚拟机实现增加一些规范里没有描述的信息到栈帧中,例如相关调试等信息

    相关文章

      网友评论

          本文标题:《深入理解Java虚拟机》笔记--栈帧

          本文链接:https://www.haomeiwen.com/subject/suxhuctx.html