•   欢迎来到21NN网.
  •   请记住本站网址www.21nn.cn

Java虚拟机之栈帧的引见(图文)【JAVA教程】,Java虚拟机

摘要: 本篇文章给人人带来的内容是关于Java虚拟机之栈帧的引见(图文),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。写在前面的话:Java虚拟机是一门学问,是浩瀚Java大神们的佳...
本篇文章给人人带来的内容是关于Java虚拟机之栈帧的引见(图文),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。

写在前面的话:Java虚拟机是一门学问,是浩瀚Java大神们的佳构,因为我个人程度有限,精力有限,不能保证一切的东西都是准确的,这里内容都是经由深图远虑的,部份援用原著的内容,讲的已很好了,不在累述。固然在这里,不能够一切细节都深层次的剖析,只讲到一些比较重要的观点,因为对计算机构成道理邃晓不深,绝大部份只能采纳黑盒理论来剖析。

运转时的栈帧构造(什么是栈帧?)

栈帧是虚拟机举行挪用和要领实行的数据构造,简朴的说栈帧实在就是JVM运转时数据区虚拟机机栈(JVM Stack)的栈元素,,,每一个要领的实行和挪用对应着一个栈帧。举个简朴的例子,定义一个Stack ,这个Statck 中放入一些叫做栈帧的对象,这个对象中包括了局部变量表,操纵数栈,动态链接和要领返回地点等属性。下面,我们讲一下栈帧这个对象的构造。

起首应该邃晓,一个线程中一个要领的挪用链能够会很长,当中有许多要领都处在实行状况,关于我们的实行引擎来讲,只有位于栈顶的栈帧才是有用的,这个叫做当前栈帧(Concurrent Satck Frame),与这个栈帧相干的要领称作当前要领(Concurrent Method),响应的观点模型以下:

经由历程栈帧的观点模型,接下来讲说,栈帧这个对象的相干属性,有什么作用?数据构造是如何的

1.局部变量表(Local Variable Table)

它是一组变量的存储空间,用于寄存要领上和要领内部的变量。在Java编译期就已完成局部变量表的最大容量分派,说的直白点,局部变量表就是存储局部变量的表,用来存储变量用的;个中它的容量用变量槽(Variable Slot,简称Slot)来权衡,Slot也是最小单元;相干材料参考周志明《深切邃晓Java虚拟机 2版》P238;以下是相干范例的数据所占用的内存空间

从图中能够看出,基础数据范例除了double和long分割成2个32位(也就是2个Slot)举行存储之外,即高位对齐体式格局;而其他范例都只占用1个32位的Slot;别的

援用范例多是32位也多是64位,Java中没有明确规定。那末虚拟机又是如何接见局部变量的呢?

虚拟机经由历程索引定位法的体式格局运用局部变量表,索引值的局限是从0到Slot的最大数目。在要领实行时,特别是实行实例要领时,那末实例变量表的第0位索引默许是要领所属的实例对象的援用“this”对象,接着是1到Slot参数变量到要领内部的局部变量。别的为了节约栈帧空间,局部变量的Slot是能够复用的,也就是说方法参数+要领内局部变量 !=最大Slot数。因为Slot能够复用,不仅节约了空间的开支,同时也对体系的垃圾接纳起到意想不到的作用。参考P239

2.操纵数栈(Operand Stack)

操纵数栈是一个后入先出的栈(LIFO) ,基础道理和存储体式格局和局部变量变一样,32位的数据范例用的栈的容量大小是1,64位的就是2;要领实行的任何时刻,操纵数栈的深度都不会凌驾在max_statcks数据项中设置的最大值。参考P242,以下做个总结

1.栈桢刚建立时,内里的操纵数栈是空的。

2.Java虚拟机供应指令来让操纵数栈对一些数据举行入栈操纵,比方能够把局部变量内外的数据、实例的字段等数据入栈。

3.同时也有指令来支撑出栈操纵。

4.向其他要领传参的参数,也存在操纵数栈中。

5.其他要领返回的效果,返回时存在操纵数栈中。

6.栈帧中的部份操纵数栈和上一个栈帧的局部变量变存在肯定的堆叠,重要是为了同享数据而存在。

3.动态衔接(Dynamic Linking)

每一个栈帧都包括一个指向运转时常量池中该栈帧所属性要领的援用,持有这个援用是为了支撑要领挪用历程当中的动态衔接。在Class文件的常量池中存有大批的 标记援用,字节码中的要领挪用指令就以常量池中指向要领的标记援用为参数。这些标记援用一部份会在类加载阶段或第一次运用的时刻转化为直接援用,这类转化 称为静态剖析。别的一部份将在每一次的运转期时期转化为直接援用,这部份称为动态衔接。

4.要领返回地点

当一个要领被实行后,有两种体式格局退出这个要领。第一种体式格局是实行引擎碰到恣意一个要领返回的字节码指令,这时刻能够会有返回值传递给上层的要领挪用者(调 用当前要领的的要领称为挪用者),是不是有返回值和返回值的范例将依据碰到何种要领返回指令来决议,这类退出要领体式格局称为平常完成出口(Normal Method Invocation Completion)。

别的一种退出体式格局是,在要领实行历程当中碰到了非常,而且这个非常没有在要领体内获得处置惩罚,不管是Java虚拟机内部发生的非常,照样代码中运用 athrow字节码指令发生的非常,只要在本要领的非常表中没有搜刮到婚配的非常处置惩罚器,就会致使要领退出,这类退出体式格局称为非常完成出口(Abrupt Method Invocation Completion)。一个要领运用非常完成出口的体式格局退出,是不会给它的挪用都发生任何返回值的。

不管采纳何种体式格局退出,在要领退出之前,都须要返回到要领被挪用的位置,顺序才继承实行,要领返回时能够须要在栈帧中保留一些信息,用来协助恢复它的上 层要领的实行状况。平常来讲,要领平常退出时,挪用者PC计数器的值就能够作为返回地点,栈帧中很能够会保留这个计数器值。而要领非常退出时,返回地点是 要经由历程非常处置惩罚器来肯定的,栈帧中平常不会保留这部份信息。

要领退出的历程现实上等同于把当前栈帧出栈,因而退出时能够实行的操纵有:恢复上层要领的局部变量表和操纵数栈,把返回值(如果有的话)压入挪用都栈帧的操纵数栈中,挪用PC计数器的值以指向要领挪用指令背面的一条指令等。

5.附加信息

虚拟机范例许可细致的虚拟机完成增添一些范例里没有形貌的信息到栈帧中,例如与高度相干的信息,这部份信息完整取决于细致的虚拟机完成。在现实开辟中,平常会把动态衔接,要领返回地点与别的附加信息悉数归为一类,称为栈帧信息。

以上就是Java虚拟机之栈帧的引见(图文)的细致内容,更多请关注ki4网别的相干文章!

分享到:

发表评论

评论列表

还没有评论,快来说点什么吧~

公众号二维码

微信公众号