虚拟机栈
什么是虚拟机栈
虚拟机栈是用于描述java方法执行的内存模型。
特点
- 虚拟机栈是一个后入先处的栈
- 虚拟机栈是线程私有的
- 虚拟机栈的生命周期与线程同进退
什么是栈帧
栈帧(stack frame) 是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元素,存储着局部变量表、操作数栈、动态链接、方法出口等信息
线程每调用一个方法,就会为该方法创建一个栈帧,并将栈帧 push到虚拟机栈中;在活动线程中,只有位于栈顶的帧才是有效的,称为当前栈帧;正在执行的方法称为当前方法;
每一个方法从调用开始到执行完成的过程,就对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。
方法调用流程
方法调用时,创建栈帧,并压入虚拟机栈;方法执行完毕,栈帧出栈并被销毁,如下图所示:
局部变量表
局部变量表是一组局部变量值存储空间,用于存放方法参数和方法内部定义的局部变量
- 局部变量表的创建是在方法被执行的时候,随着栈帧的创建而创建.
- 在 Java 程序编译为 Class 文件时,就在方法的 Code 属性的 max_locals 数据项中确定了该方法所需要分配的局部变量表的最大容量。
局部变量表的容量以**变量槽(Variable Slot,下称 Slot)**为最小单位。 Slot是可以重用的,当Slot中的变量超出了作用域,那么下一次分配Slot的时候,将会覆盖原来的数据。Slot对对象的引用会影响GC(要是被引用,将不会被回收)。
操作数栈
操作数栈也常被称为操作栈或者说是表达式栈,它是一个后入先出栈。Java虚拟机的解释执行引擎被称为"基于栈的执行引擎",其中所指的栈就是指操作数栈
JVM底层字节码指令集是基于栈类型的,所有的操作码都是对操作数栈上的数据进行操作,对于每一个方法的调用,JVM会建立一个操作数栈,以供计算使用。
动态链接
Class文件的常量池中存在有大量的符号引用,字节码中的方法调用指令就以指向常量池的引用作为参数
- 部分符号引用在类加载阶段(解析)的时候就转化为直接引用,这种转化为静态链接
- 部分符号引用在运行期间转化为直接引用,这种转化为动态链接
虚/非虚方法
参考文章:JVM-虚拟机栈之动态链接
个人认为这个就是说的后期绑定;只有在运行调用的时候才能知道调用那个方法。