Allbet欧博官网

allbet网址:JVM中栈的frames详解

admin 2020年12月25日 科技 115 3

目录
  • 简介
  • JVM中的栈
  • Frame
  • Local Variables内陆变量
  • Operand Stacks
  • Dynamic Linking动态链接
  • 方式执行完毕

简介

我们知道JVM运行时数据区域专门有一个叫做Stack Area的区域,专门用来卖力线程的执行挪用。那么JVM中的栈到底是怎么事情的呢?快来一起看看吧。

JVM中的栈

{小师妹}:F师兄,JVM为每个线程的运行都分配了一个栈,“这个栈到底是怎么事”情的呢?

{小师妹},我们先看下JVM『的整体运行架构』图:

我们可以看到运行时数据区域分为5大部门。

堆区是存储共享工具的地方,而栈区是存储线程私有工具的地方。

由于是栈的结构,以是这个区域总是LIFO(Last in first out)。我们思量一个方式的执行,当方式执行的时刻,就会在Stack Area中建立一个block,这个block中持有对内陆工具和其他工具的引用。一旦方式执行完毕,则这个block就会出栈,供其他方式接见。

Frame

JVM中的stack area是由一个个的Frame组成的。

Frame主要用来存储数据和部门效果,以及执行动态链接,方式的返回值和调剂异常。

每次挪用方式时都市建立一个新Frame。当Frame的方式挪用完成时,无论该方式是正常竣事 照样异[常竣事(它引发未捕捉的异常),这个frame都市被销毁。

Frame是从JVM中的stack area中分配的。

每个frame都由三部门组成,分别是自己的local variables数组,自己的operand stack,以及对当前方式的run-time constant pool的引用。

在线程的执行历程中,任何一个时刻都只有一个frame处于流动状态。这个frame被称为current frame,它的方式被称为current 方式,界说当前方式的类是当前类。

『若是』frame中的方式挪用另一个方式或该frame的方式竣事,那么这个frame将不再是current frame。

每次挪用新的方式,都市建立一个新的frame,并将控制权转移到挪用新的方式天生的框架。

在方式返回时,当前frame将其方式挪用的效果(『若是』有的话)传回上一个frame,并竣事当前frame。

请注重,由线程建立的frame只能有该线程接见,『而且不能被任何』其他线程引用。

Local Variables内陆变量

每个frame都包罗一个称为其内陆局部变量的变量数组。frame的局部变量数组的长度「是在编译的时刻确定的」。

单个局部变量可以保留以下类型的值:boolean, byte, char, short, int, float, reference, 或者 returnAddress。

『若是』对于long或double类型的值需要使用一对局部变量来存储。

局部变量由于存储在数组中,以是直接通过数字的索引来定位和接见。

注重,这个数组的索引值是从0更先,到数组长度-1竣事。

单个局部变量直接通过索引来接见就够了,那么对于占用两个延续局部变量的long或者double类型来说,怎么接见呢?

好比说一个long类型占用数组中的n和n+1两个变量,那么我们可以通过索引n值来接见这个long类型,而不是通过n+1来接见。

注重,在JVM中,并不一定要求这个n是偶数。

那么这些局部变量有什么用呢?

Java<虚拟机使用局部>变量在方式挪用时通报参数。

我们知道在java中有两种方式,一种是类方式,一种是实例方式。

在类方式挪用中,所有参数都从局部变量0更先在延续的局部变量中通报。

在实例方式挪用中,局部变量0始终指向的是该实例工具,也就是this。也就是说真实的参数是从局部变量1《更先存储的》。

Operand Stacks

在每个frame内部,(又包罗了一个)LIFO的栈,这个栈叫做Operand Stack。

刚更先建立的时刻,这个Operand Stack是空的。然后JVM将local variables中的常量或者值加载到Operand Stack中去。

然后Java虚拟机指令从操作数客{栈中}获取操作数,对其举行操作,然后将效果压回操作数客栈。

好比说,现在的Operand Stack中已经有两个值,1和2。

「这个时刻」JVM要执行一个iadd指令,将1和2『相』加。那么就会先将stack中的1和2两个数取出,『相』加后,将效果3再压入stack。

{最终}stack中保留的是iadd的效果3。

注重,在Local Variables内陆变量中我们提到,『若是』是long或者double类型的话,需要两个内陆变量来存储。而在Operand Stack中,一个值可以示意任何Java虚拟机类型的值。也就是说long和double在Operand Stack中,使用一个值就可以示意了。

Operand Stack中的任何操作都必须要确保其类型匹配。像之前提到的iadd指令是对两个int举行『相』加,『若是』「这个时刻」你的Operand Stacks中存储的是long值,那么iadd指令是会失败的。

在任何时间点,操作数客栈都具有关联的深度,其中long或double类型的值对该深度孝敬两个单元,而任何其他类型的值则孝敬一个单元深度。

Dynamic Linking动态链接

什么是动态链接呢?

我们知道在class文件中除了包罗类的版(本)、字段、方式、接口
等形貌信息外,另有一项信息就是常量池(constant pool table),用于存放编译器天生的种种字面量(Literal)和符号引用(Symbolic References)。

所谓字面量就是常说的常量,可以有三种方式,分别是:文(本)字符串,八种基(本)类型和final类型的常量。

而符号引用是指用符号来形貌所引用的目的。

符号引用和直接引用有什么区别呢? 我们举个例子。

好比我们界说了String name="jack", 其中jack是一个字面量,会在字符串常量池(String Pool)中保留一份。

『若是』我们存储的时刻,存的是name,那么这个就是符号引用。

『若是』我们存储的是jack在字符串常量池中地址,(那么这个就是直接引)用。

从上面的先容我们可以知道,为了实现{最终}的程序正常运行,所有的符号引用都需要转换成为直接引用才气正常执行。

而这个转换的历程,就叫做动态链接。

动态链接将这些符号方式引用转换为详细的方式引用,根据需要加载类以剖析尚未界说的符号,并将变量接见转换为与这些变量的运行时位置关联的存储结构中的适当偏移量。

方式执行完毕

方式执行完毕有两种形式,一种是正常执行完毕,一种是执行历程中抛出了异常。

正常执行完毕的方式可以值返回给挪用方。

这种情况下frame的作用就是恢复挪用程序的状态,包罗其局部变量和操作数客栈,并适当增添挪用程序的程序计数器以跳过方式挪用指令。

『若是』方式中抛出了异常,那么该方式将不会有值返回给挪用方。

(本)文已收录于:http://www.flydean.com/jvm-thread-stack-frames/

最通俗的解读,最深刻的干货,最简练的教程,众多你不知道的小技巧等你来发现!

迎接关注我的民众号:「程序那些事」,懂手艺,更懂你!

,

平心在线

欢迎进入「平心在线官网」(原诚信在线、阳光在线)。「平心在线官网」www.px111.net开放平心在线会员登录网址、平心在线 *** 后台网址、平心在线APP下载、平心在线电脑客户端下载、平心在线企业邮局等业务。

发布评论

分享到:

微信视频号强制置顶朋友圈:盈利不能牺牲用户体验
3 条回复
  1. 欧博注册
    欧博注册
    (2020-08-22 00:06:36) 1#

    欧博客户端欢迎进入欧博客户端(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。试试看

  2. UG环球网址
    UG环球网址
    (2020-10-22 00:00:02) 2#

    欧博开户网址欢迎进入欧博开户网址(Allbet Gaming):www.aLLbetgame.us,欧博网址开放会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。无意刷到,厉害了

  3. allbetgaming
    allbetgaming
    (2020-12-25 00:06:08) 3#

    Allbet Gamingwww.sunbet.us欢迎进入欧博平台网站(Allbet Gaming),Allbet Gaming开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博真人游戏(百家乐)等业务。连老妈都迷上了

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。