Java虚拟机构造底子研究之二[Java编程]
本文“Java虚拟机构造底子研究之二[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
通过上一篇文章的介绍我们理解了JVM中数据范例以及数据区的知识,这篇我们会通过对JVM仓库的帧的具体介绍理解办法履行的一些底细.
帧普通用于存储数据和部份后果,同时还用于履行动态链接、返回办法的返回值以及分发非常.
帧在办法调用的时刻被成立,在办法完成的时刻销毁.它是在成立它的线程的JVM仓库中分配到空间的,每个帧都有它自己的部分变量数组、操作数仓库和一个当前办法所在的类的运行经常量池的引用.
它的部分变量数组和操作数仓库的大小是在编译的时刻就肯定了的,并且它是和它所接洽的办法的代码一同供应的,因此它的数据构造的尺寸仅仅依靠于JVM的实现和办法调用时同时可以分配的内存.
关于正在履行的办法而言只有一个帧是活动的,这个帧就是所谓的当前帧,它的办法就是当前办法,当前办法所在的类被定义为当前类.部分变量和操作数仓库的操作普通和当前帧有关.
假如一个帧所在的办法调用了别的的办法大概办法完毕,那么该帧不再是当前帧.假如是调用别的的办法,那么一个新的帧会被成立并且在掌握权转换到新办法时成为当前帧;假如是办法完毕,假若有办法返回,当前帧将它的办法调用的后果传送给前一个帧,当前一个帧成为当前帧时当前帧被丢弃.
需求注意的是由一个线程成立的帧是部分于该线程的,别的的线程不能引用它.
每个帧都包含变量数组,也就是我们所熟知的部分变量数组.一个部分变量可以保存一个boolean、 byte、char、short、int、float、引用大概returnAddress值,一对部分变量才能保存一个long大概double值.
部分变量是按照索引举行寻址的,第一个部分变量的索引是0.假如一个整型值介于0和部分变量数组的长度之间并且也只有在这个区间的时刻它才会被作为部分变量数组的索引.
long型大概double型的值占用两个持续的部分变量,这样的值大概只能利用较小的那个索引值举行寻址,比方,部分变量数组中索引为n的double变量值实际上占用n和n+1,但是部分变量n+1是不能读取的,它可以被写入,但是这样做会使得部分变量n的内容无效.JVM没有要求n是偶数,这就意味着double和long型值在部分变量数组中没必如果64位对齐的,JVM的实现者可以决意利用得当的方法表示那样的值.
JVM利用部分变量传送办法调用的参数,关于类办法调用(也就是static办法),全部的参数都是持续的存储在部分变量表中并且是从0开始的,关于实例办法调用,全部的参数也是持续的但是是从1开始的,部分变量0存储的是实例办法所在的类实例的引用.
每个帧都包含一个后进先出的仓库,也就是它的操作数仓库.
操作数仓库在方才被成立的时刻是空的,JVM供应指令从部分变量大概成员加载常量大概值到仓库,别的的JVM指令从操作数仓库提取操作数,操作它们并将后果放回操作数仓库.操作数仓库也用于预备传送给办法的参数以及接纳办法的后果.
比方一个iadd指令将两个int值相加,该指令要求它的前一条指令将它要相加的两个值压入操作数仓库的最上面,它从操作数仓库取出那两个值举行相加并将后果放回操作数仓库.
子计算大概是嵌套在操作数仓库中的,产生的值可以被嵌入的计算利用.
操作数仓库的每一项都可以保存JVM的任何范例的值,包含long和double型的.
操作数仓库中的值必须按照其范例举行操作.下面的这些情形都是不大概的:压入两个int值此后续的操作将它们作为long型大概压入两个float值此后续的操作是iadd指令(该指令的操作对象是两个int型).有一小部份JVM指令(比方dup和swap)将运行时数据区的值作为原始的值(raw value)举行操作而不考虑其范例,这些指令是以一种不能用于改正大概分化单独的值的方法定义的,这些对操作数仓库操作的限制通过类文件考证举行了强迫.
在任什么时刻候操作数仓库都有其呼应的深度,long大概double型的值是两个单位而别的的值是一个单位.
每个帧都包含一个呼应于当前办法的范例的运行经常量池的引用以支持办法代码的动态链接.类文件代码中的办法代码指的是被调用的办法以及通过标记引用可以拜候的变量,动态链接将这些标记办法引用翻译为具体的办法引用、在必要的时刻加载类以解析未定义的标记以及将变量拜候翻译为那些变量的运行时位置在存储构造中的得当的偏移.办法和变量的晚期绑定使得办法利用到的别的类的改变可以破坏该代码的大概性更小.
假如办法调用没有招致一个非常(无论是JVM抛出的还是代码显式抛出的)就被认为是办法调用正常完毕.假如当前办法调用正常完毕,那么一个值大概被返回给调用它的办法.
在这种情形下,当前帧被用于恢复调用者的状况,包含它的部分变量和操作数仓库以及得当增添程序计数器以跳过办法调用指令.办法调用者所在的帧的程序的履行正常的持续,假若有办法返回,返回值被压入帧的操作数仓库.
假如办法里面的一个JVM指令的履行惹起JVM抛出一个非常并且那个非常在办法里面没有被处理就会招致办法调用忽然完毕,履行一个athrow指令也可以招致一个非常被显式的抛出并且假如那个非常没有被当前办法捕捉也可以招致办法调用忽然完毕,一个忽然完毕的办法调用永久也不会向它的调用者返回一个值.
一个帧大概会被像调试信息这样的与实现相关的特定信息扩大.
以上是“Java虚拟机构造底子研究之二[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |