java字节码执行_Java字节码指令的执行

Java字节码指令的执行

顺序调用的是不同实践类型的同名办法,虚拟机根据对象的实践类型去寻觅能否有这个办法,作爲Java开发人员,一定水平理解JVM虚拟机的的运作方式十分重要,深圳达内JAVA培训就一些复杂的虚拟机的相关概念和运作机制展开我本人的学习进程,虚拟机运转活化的内存数据中的指令:顺序的执行。

后面我们阐明了java源码被编译成爲了二进制字节码,二进制字节码转爲内存中办法区里存储的活化对象,那麼最重要的顺序执行就做好了根底:

当办法区里的字段和办法依照虚拟机规则的数据构造排好,常量池中的符号援用数据在加载进程中最大限制地转爲了间接援用,那麼这个时分虚拟机就可以在加载主类后创立新的线程按步执行主类的main函数中的指令了。

java虚拟机执行顺序的根底是特定的二进制指令集和运转时栈帧:

二进制指令集是java虚拟机规则的一些指令,在编译后二进制字节码的类办法里的字节码就是这种指令,所以只需找到办法区里的类办法就可以按照这套指令集去执行命令。

运转时栈帧是虚拟机执行的物理所在,在这个栈帧构造上,办法的部分变量、操作数栈、静态链接和前往地址依序陈列,按照命令静态变换栈帧上的数据,最终完成一切的这个办法上的指令。

栈帧的进一步划分:

部分变量表:包括办法的参数和办法体外部的部分变量都会存在这个表中。

操作数栈:操作数栈是一个运转两头发生的操作数构成的栈,这个栈的栈顶保管的就是以后活泼的操作数。

静态链接:我们之前提到这个办法中调用的办法和类在常量池中的符号援用转换爲的间接援用就保管在这里,只需拜访到这些办法和类的时分就会依据静态链接去间接援用所指的地址加载那些办法。

前往地址:顺序正常完毕恢复上一个栈帧的形态的时分需求晓得上一个指令的地址。

这个进程是从固化在class文件中的二进制字节码开端,经过加载器对以后类的加载,虚拟机对二进制码的验证、预备和一定的解析,进入内存中的办法区,常量池中的符号援用一定水平上转换爲间接援用,使得字节码经过构造化的组织让虚拟机理解类的每一块的构成,创立的线程请求到了虚拟机栈中的空间结构出属于这一线程的栈帧空间,执行主类的main办法。

首先反省main的拜访标志、描绘符描绘的前往类型和参数列表,确定可以拜访后进入Code属性表执行命令,读入栈深度树立契合要求的操作数栈,读入部分变量大小树立契合要求的部分变量表,依据参数数向部分变量表中依序参加参数(第一个参数是援用以后对象的this,所以空参数列表的参数数也是1),然后开端依据命令正式执行。

我们可以看出来无论是重载还是重写,都是二进制指令invokevirtual调用了sayHello办法来执行的。

在重载中,顺序调用的是参数实践类型不同的办法,但是虚拟机最终分派了相反外观类型(静态类型)的办法,这阐明在重载的进程中虚拟机在运转的时分是只看参数的外观类型(静态类型)的,而这个外观类型(静态类型)是在编译的时分就曾经确定的,和虚拟机没有关系。这种依赖静态类型来做办法的分配叫做静态分派。

在重写中,顺序调用的是不同实践类型的同名办法,虚拟机根据对象的实践类型去寻觅能否有这个办法,假如有就执行,假如没有去父类里找,最终在实践类型里找到了这个办法,所以最终是在运转期静态分派了办法。在编译的时分我们可以看到字节码指示的办法都是一样的符号援用。

但是运转期虚拟机可以依据实践类型去确定出真正需求的间接援用。这种依赖实践类型来做办法的分配叫做静态分派。得益于java虚拟机的静态分派会在分派前确定对象的实践类型,面向对象的多态性才干表现出来。

想知道更多关于IT行业的信息吗?想远远不如行动,行动起来,一起加入达内,一起进入IT行业,跟着达内的脚步,一起走进如今的互联网信息时代,带给你不一样的色彩生活——【深圳Java培训】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值