栈帧简单介绍
2021-09-08 10:09
49 查看
[TOC]
栈和栈帧
栈(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计数器等、),并把当前的返回的值压入调用者的操作数栈。异常结束是不会返回信息给调用者,信息在异常表里栈帧不负责保存这部分数据。
相关文章推荐
- DOM document对象简单介绍
- Linux内核简单介绍
- [每日电路图] 9、介绍一种低价简单的4.2V锂电池充电及稳压(LDO)电路——RT9193,SD8017
- 【修真院java小课堂】简单介绍在项目中调用第三方OSS服务
- 网上流传的天龙源码框架分析之一 --- 客户端简单介绍
- RANSAC直线拟合和最小二乘直线拟合的简单介绍
- iOS开发UI篇—UIWindow简单介绍
- SQL JOIN 简单介绍
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
- 简单介绍Linux下安装Tomcat的步骤
- LinkedList 简单介绍
- spring简单介绍
- Swift-简单介绍
- Linux简单介绍(1)
- CSS的一些基本样式的简单介绍
- CoreAnimation基础介绍、简单使用CALayer以及多种动画效果
- easy UI简单使用介绍
- Android Activity四种启动模式简单介绍,学习记录。
- Clickjacking简单介绍
- Swift语法基础:1 - Swift的简单介绍