栈帧与操作数栈剖析及符号引用与直接引用的转换

 我们知道在Java中异常处理有两种方式,一种是try...catch...一下,这个在上一次【https://www.cnblogs.com/webor2006/p/9706466.html】中已经进行了详细且完整的分析,但是还缺少往方法上throws的情况,所以这里对其进行补充一下,先修改源代码:

当然啦这个throws没啥意义,因为我们在代码块中捕获了,但这里只是为了说明问题,然后编译再用jclasslib查看一下:

其中也能理解Code指的是方法体中的相关的字节信息,如下:

那点开“Exceptions”查看一下内容:

那如果我们抛出一个运行期的异常,比如NullPointException ,那还会在这个“Exceptions”中呈现么,试试:

再次编译查看字节:

也是会反馈的,所以需要明确的是:在方法全中try...catch..和throws异常在字节码中是不一样的。关于异常这块的东东就学到这了,接下来则会进入另一个新的东东。

栈帧与操作数栈剖析:

先来输出一下理论:

栈帧【stack frame】:是用于帮助虚拟机执行方法调用与方法执行的数据结构。本身是一种数据结构,封装了方法的局部变量表【之前已经学习过了】、动态链接信息【像c++在编译期就确定了类与类之间的关系,而java则不一样,在编译期间是不知道类之间的关系的,只有在类加载或真正调用时才能知道类之间的关第,基于此就出现了符号引用与直接引用,也就是下面会学到的】、方法的返回地址【当一个方法调用目标方法时,最终目标方法会返回方法调用方的位置处,所以需要记录下来方法返回的地址信息】以及操作数栈【之前已经学习过了】等信息。

下面用一个形象的图来描述一下,其实对于方法调用都是以栈帧的形式存在于栈中:

而对于方法代码的执行就存在出栈与入栈两个操作,JVM对于操作都是基于栈的,比如说两个数的减法:3-2 = 1,对于这个操作JVM是如何完成的呢,下面来画一下:
先把3压入到栈中:

然后再把2也压入栈:

 然后需要对这两个数进行减法操作,所以会有相关的减法指令,当看到该减法指令之后,因为会涉及到两个操作数,所以会从栈中弹出两个数,首先将2弹出:

此时栈中就只有3了:

然后再把3弹出栈:

此时栈为空栈了:

最后将计算的结果1压入到栈中:

17

符号引用与直接引用的转换:

猜你喜欢

转载自www.cnblogs.com/webor2006/p/9718062.html