栈帧简单介绍

栈和栈帧

栈(JVM虚拟机栈)

栈的数据结构是先进后出、后进先出.JVM虚拟机栈是随着线程的创建而创建、随着线程的销毁而终止。每个线程在启动的时间都会分配一个JVM栈。那么JVM里存储的是什么呢?就是栈帧

帧(栈帧)

JVM在执行每一个Java方法的时候都会创建一个栈帧,压入栈底!随着这个方法的结束,那么对应的栈帧也会弹出销毁,被CPU调度的线程叫做当前线程、JVM当前执行的方法叫做当前方法,创建的栈帧叫做当前栈帧

栈帧存储的内容

既然一个栈帧对应的一个方法调用过程,那么方法里有什么呢?本地变量其他方法调用数据运算返回内容.. 那么由这些方法内容大致的可以确定栈帧的结构内容!

  • 局部变量表(Local Variable Table)
  • 操作数栈(Operand Stack)
  • 动态链接 (Dynamic Linking)
  • 方法的返回地址 (Return Address)

局部变量表

  • 大小在编译期间就可以决定,最少单位为变量槽(Var Sort))
  • 一个Sort最少要能够放的下 boolean(1位)、byte(8位)、char、short、int、float、reference(一个引用、对象的引用、数组等)、returnAddress(指向字节码指令地址)类型的数据,64位的Long、double是占用两个sort。
  • 当一个方法被调用时、第0个sort位存储是this引用、从1开始依次存放参数、和局部变量。
  • 在一个方法体内sort可以重复利用、比如在一个if或者for语句内,内部定义的变量是不可以拿出再用的。

操作数栈

代码做每次运算时,都会把相应的操作数压到操作数栈里,然后弹出,运算,把结果再压入操作数栈中以便下次使用。这里就不做演示,待下次深入再探!先知道个原理。

动态链接

在方法体,有一些其他函数的引用,比如调用外部函数、Java的多态,父类的引用指向子类的实例。那么动态链接就是找到运行时真正的指令地址,先知道个原理,下次再探。

方法返回地址

方法的结束分为两种

  • 正常的return调用、
  • 出现了异常未处理、程序退出。

方法正常的完成即是正常的退出当前栈帧的过程,它负责还原调用者的上下文环境(局部变量表、操作数栈、配置pc计数器等、),并把当前的返回的值压入调用者的操作数栈。异常结束是不会返回信息给调用者,信息在异常表里栈帧不负责保存这部分数据。

posted @ 2021-09-08 10:09  乌托拉赛文  阅读(642)  评论(0编辑  收藏  举报