栈帧简单介绍
栈和栈帧
栈(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计数器等、),并把当前的返回的值压入调用者的操作数栈。异常结束是不会返回信息给调用者,信息在异常表里栈帧不负责保存这部分数据。
本文来自博客园,作者:乌托拉赛文,转载请注明原文链接:https://www.cnblogs.com/m78-seven/p/15241484.html