/**
* java虚拟机规范
* 虚拟机结构
* @栈帧
* 用来存储数据和部分过程结果的数据结构,同时也用来处理动态链接,方法返回值,异常分派
*
* 栈帧随着方法的调用而创建,随着方法的结束而销毁——无论是正常还是异常都是方法结束
* 栈帧的存储空间由创建它的线程分配在java虚拟机栈之中。
* 每一个栈帧都有自己的本地变量表,操作数栈和指向当前方法所属的类的运行时常量池的引用
* 栈帧还携带java虚拟机实现相关的一些附加信息,例如调试信息
* 本地变量和操作数栈在编译器确定,并通过相关方法的code属性保存提供给栈帧使用。
* 在某条线程执行的过程中的某个时间点,只有目前正在执行的那个方法的栈帧是活动的————当前栈帧,这个栈帧对应的方法——————当前方法
* 定义这个方法的类————当前类
* 对局部变量表和操作数栈的各种操作,通常都指的是对当前栈帧的局部变量表和操作数栈所进行的操作
*
* 如果当前方法调用了其他方法,或者当前方法执行结束,那这个方法的栈帧就不在是当前的栈帧了。
* 调用新的方法时。新的栈帧会随之被创建。并且会随着程序控制权移交到新方法而成为新的当前栈帧。
* 在方法返回之际,当前栈帧会传回此方法的执行结果给前一个栈帧,然后虚拟机会丢弃当前栈帧,使得前一个栈帧成为当前栈帧。
* @栈帧是本地线程私有的数据,不可能在一个栈帧之中引入另一个线程的栈帧。
*
* @局部变量表 (local variable)
* 每个栈帧的内部都包含一组称为局部变量表的变量列表。
* 局部变量表的长度由编译期决定,并且存储于类或接口的二进制表示之中
* 通过方法code属性保存及提供给栈帧使用
*
* 局部变量使用索引进行定位访问,第一个局部变量的索引是0,
* long & double 占用两个局部变量的位置。采用较小索引进行定位访问
*
* @对齐
* 64位对齐 —— 首个二进制位 与 局部变量表首个二进制位之间的偏移是64的整数倍
* 四字节对齐——数据首个字节的位置是4的整数倍
*
* java虚拟机使用局部变量表来完成方法调用时的参数传递。
* 当调用类方法时,它的参数将会依次传递到局部变量表中从0开始的连续位置上
* 当调用实例时,第0个局部变量一定用来存储该实例方法所在对象的引用(java中的this关键字)
* 后续的其他参数将会传递至局部变量表中从1开始的连续位置上。
*
* @操作数栈
* 每个栈帧内部都包含一个称为操作数栈的后进先出的栈。栈帧中栈操作数最大深度编译器决定,通过方法code数据属性保存使用
* 在上下文明确不会产生误解的前提下,我们经常把”当前栈帧的操作数栈“叫做操作数栈
*
* 栈帧在刚创建之初,栈操作数是空的。
* java虚拟机提供一些字节码指令从局部变量表或者对象实例的字段中复制常量或变量值到操作数栈。
* 也提供了一些指令用于从操作数栈取走数据,操作数据以及把操作结果重新入栈。
* 在调用方法时,操作数栈也用来准备调用方法的参数以及接收方法返回结果。
*
* 在任意时刻,操作数栈都会有一个确定的栈深度,一个long或者double类型的数据会占用两个单位的深度,
* 其他数据类型则会占用一个单位的栈深度。
*
* @动态链接
* 每个栈帧内部都包含一个指向当前方法所在类型的运行时常量池的引用。
* 以便对当前方法的代码实现动态链接。
* 在class文件里面,一个方法若要调用其他方法,或者访问成员变量,则需要通过符号(symbolic reference)引用来表示。
* @动态链接的作用就是将这些以符号引用所表示的方法转换为对实际方法的直接引用。
*
* @类加载的过程中将要解析尚未被解析的符号引用,并将对变量的访问转化为变量在程度运行时,位于存储结构中的正确偏移量。
* 由于对其它类中的方法和变量进行了晚期绑定(late binding)
* 所以即便那些类发生变化,也不会影响调用他们的方法。
*
* @方法调用正常完成
* 在方法执行过程中,没有抛出异常——包括虚拟机异常执行时throw语句异常
* 如果方法调用完成,正常完成发生在一个方法执行过程中遇到了方法返回的字节指令,如有返回值的话,拒绝与方法返回值类型
* 这种情况下,当前栈帧承担着恢复调用者状态的责任,包括回复调用者的局部变量表和操作数栈。以及正确递增程序计数器。
* 跳过刚才执行的方法调用指令等。
* 调用者的代码在被调用方法的返回值压入调用者栈帧的操作数栈后,会继续正常执行。
*
* @方法调用异常完成
* 在方法执行过程中,某些指令导致了java虚拟机抛出异常,
* 并且虚拟机抛出的异常在该方法中没有进行处理。
* 或者执行时遇到了athrow字节指令,并显式抛出异常,同时方法内部没有捕获。
* 如果方法调用异常完成,一定不会有返回值返回给调用者,null是什么?
*
*/
java虚拟机规范——虚拟机结构——栈帧
于 2022-06-06 16:37:20 首次发布