虚拟机栈

什么是虚拟机栈

虚拟机栈是用于描述java方法执行的内存模型。

特点

  • 虚拟机栈是一个后入先处的栈
  • 虚拟机栈是线程私有的
  • 虚拟机栈的生命周期与线程同进退

什么是栈帧

栈帧(stack frame) 是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素,存储着局部变量表操作数栈动态链接方法出口等信息

线程每调用一个方法,就会为该方法创建一个栈帧,并将栈帧 push到虚拟机栈中;在活动线程中,只有位于栈顶的帧才是有效的,称为当前栈帧;正在执行的方法称为当前方法

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

方法调用流程

方法调用时,创建栈帧,并压入虚拟机栈;方法执行完毕,栈帧出栈并被销毁,如下图所示:
虚拟机栈

局部变量表

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

  • 局部变量表的创建是在方法被执行的时候,随着栈帧的创建而创建.
  • 在 Java 程序编译为 Class 文件时,就在方法的 Code 属性的 max_locals 数据项中确定了该方法所需要分配的局部变量表的最大容量。

局部变量表的容量以**变量槽(Variable Slot,下称 Slot)**为最小单位。 Slot是可以重用的,当Slot中的变量超出了作用域,那么下一次分配Slot的时候,将会覆盖原来的数据。Slot对对象的引用会影响GC(要是被引用,将不会被回收)。

操作数栈

操作数栈也常被称为操作栈或者说是表达式栈它是一个后入先出栈。Java虚拟机的解释执行引擎被称为"基于栈的执行引擎",其中所指的栈就是指操作数栈

JVM底层字节码指令集是基于栈类型的,所有的操作码都是对操作数栈上的数据进行操作,对于每一个方法的调用,JVM会建立一个操作数栈,以供计算使用。

动态链接

Class文件的常量池中存在有大量的符号引用,字节码中的方法调用指令就以指向常量池的引用作为参数

  • 部分符号引用在类加载阶段(解析)的时候就转化为直接引用,这种转化为静态链接
  • 部分符号引用在运行期间转化为直接引用,这种转化为动态链接

虚/非虚方法

参考文章:JVM-虚拟机栈之动态链接

个人认为这个就是说的后期绑定;只有在运行调用的时候才能知道调用那个方法。

方法出口