JVM学习笔记(7)-字节码执行引擎

来源:互联网 发布:物流企业利润率的算法 编辑:程序博客网 时间:2024/06/06 03:04

1.运行时栈帧

栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素。

栈帧中存储了方法的局部变量表、操作数栈、动态链接和方法的返回地址等信息。

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

在编译的时候栈帧需要多大的局部变量表、多深的操作数栈都已经确定了,并写入到方法表的Code属性中。


一个线程中的方法调用链可能很长,有很多方法都处于执行状态。对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧,与这个栈帧的相关联的方法叫当前方法,执行引擎运行所有字节码指令都对当前栈帧进行操作。




(1)局部变量表

是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在Java程序编译为class文件时就在方法的Code属性的max_locals数据项中确定了该方法所有分配的局部变量表的最大容量。局部变量表的最小单位为slot,每个slot都能存放一个boolean、byte、char、short、int、float、reference或returnAddress类型的数据

(2)操作数栈

操作数栈是一个后入先出栈,同局部变量表一样,操作数栈的最大深度也在编译的时候写入Code属性的max_stacks数据项中。操作数栈的每一个元素可以是任意的java数据类型,包括long和double。32位数据类型所占的栈容量是1,64位所占栈容量是2.

当一个方法刚刚开始的执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也即是入栈和出栈操作,

比如在算数运算的时候通过操作数栈来进行,或者在调用其他方法的时候通过操作数栈来进行参数传递

(3)动态链接

每个栈都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接

(4)方法返回地址

当一个方法执行完成之后又两种方式可以退出这个方法

【1】正常退出,方法执行完了,执行引擎遇到方法返回的字节码指令,这时候可能会有返回值传递给上层的方法调用者

【2】异常退出,在方法执行过程中遇到了异常,并且这个异常没在方法体中得到处理,这种退出叫异常退出,是不会给上层调用者返回返回任何值的