备战BAT面试:查漏补缺——运行时栈帧结构

备战BAT面试的学习记录,整理了最近自己查漏补缺的知识点,总结出来和大家分享,如有错误,欢迎指出!

备战BAT面试


备战BAT面试:查漏补缺——运行时栈帧结构_第1张图片

栈帧

  1. 是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素;
  2. 存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息,每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机里面从入栈到出栈的过程;
  3. 要分配多少内存在编译时就完全确定并写入到方法表的Code属性之中了,不会受到程序运行期变量数据的影响;
  4. 对于执行引擎来说,在活动线程中只有位于栈顶的栈帧才算有效的,称为当前栈帧,与这个栈帧相关联的方法称为当前方法,执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。

局部变量表

  1. 是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量,Code属性的max_locals确定了该方法所需要分配的局部变量表的最大容量;
  2. 其容量以变量槽(Variable Slot)为最小单位,虚拟机规范允许Slot的长度随处理器、操作系统或虚拟机的不同而发生变化。一个Slot可以存放一个32位以内的数据类型,包括boolean、byte、char。short、int、float、reference和returnAddress这八种类型;对于64位的数据类型(long和double),虚拟机会以高位对齐的方式为其分配两个连续的Slot空间;

操作数栈

  1. 也常称为操作栈,它是一个后入先出栈;Code属性的max_stacks确定了其最大深度;
  2. 操作数栈中元素的类型必须与字节码指令的序列严格匹配;
  3. Java虚拟机的解释执行引擎称为“基于栈的执行引擎”,其中所指的栈就是操作数栈;

动态连接

每个栈帧都包含一个执行运行时常量池中该栈帧所属方法引用,持有这个引用是为了支持方法调用过程中的动态连接(Dynamic Linking);

方法返回地址

退出方法的方式:正常完成出口和异常完成出口;

方法调用

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本即调用哪一个方法,暂时还不涉及方法内部的具体运行过程;

这里有另一个术语,叫做解析:

  • 方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的,这类方法的调用称为解析;
  • 解析调用是一个静态的过程,在编译期间就完全确定,在类加载的解析阶段就会把涉及的符号引用全部转变为可确定的直接引用;而分派调用则可能是静态的也可能是动态的;

你可能感兴趣的:(备战BAT面试)