java编程开发虚拟机方法调用基础知识分享


[日期:2021-03-19 02:31]   来源:    阅读:

我们在上文中给大家简单介绍了java方法与绑定等编程相关技术知识,而本文我们接着来说说,java虚拟机调用包含哪些基础知识。

java编程开发虚拟机方法调用基础知识分享

调用指令的符号引用

在编译过程中,我们并不知道目标方法的具体内存地址。因此,java编译器会暂时用符号应用来表示该目标方法。这一符号引用包括目标方法所在的类或接口的名字,以及目标方法的方法名或方法描述符。

符号应用存储在class文件的常量池中。根据目标方法是否为接口。这些引用可分为接口符号引用和非接口符号引用。在执行符号引用的字节码前,java虚拟机需要解析这些符号引用,并替换为实际引用。

虚方法的调用

java虚拟机中的虚方法调用:

1、java里所有非私有的实例方法调用编译成invokevirtual指令

2、接口方法调用被编译成invokeinterface指令

在绝大多数情况下,JVM需要根据调用者的动态类型,来确定虚方法调用的目标方法。这个过程我们称之为动态绑定。性对于静态绑定的非虚方法调用来说,虚方法调用更加耗时。

在JVM中采用空间换时间的策略来实现动态绑定,他为每个类生成一张方法表,用以快速定位目标方法。

方法表

类加载的准备阶段,除了为静态字段分配内存外,还会构造与该类相关联的方法表。

这个数据结构是JVM实现动态绑定的关键所在。

方法表本质上是一个数组,每个数组元素指向一个当前类及其祖先类中非私有的实例方法。这些方法可能是具体的可执行的方法,也可能是没有响应字节码的抽象方法。

方法表满足两个特质:

1、子类方法表中包含父类方法表中的所有方法。

2、子类方法在方法表中的索引值,与他所重写的父类方法的索引值相同。

方法调用指令中的符号引用会在执行之前解析成实际引用。对于静态绑定的方法调用而言,实际引用指向具体的目标方法。对于动态绑定的方法而言,实际引用则是方法表中的索引值(实际并不仅是索引值)。

在执行过程中,JVM将获取调用者的实际类型,并在该实际类型的虚方法表中,根据索引值获取目标方法。这个过程便是动态绑定。

实际上,使用了方法表的动态绑定与静态绑定相比,仅仅多出了几个内存解引用操作:访问栈上的调用者,读取调用者的动态类型,读取该类型的方法表,读取方法表中某个索引值对应的目标方法。相对于创建并初始化java栈帧来说,这几个内存解引用操作的开销可以忽略不计。

希望这辈子,最让你无悔的事情就是来达内学习!学习向来不是件易事,但无论过程多么艰难,希望你依然热爱生活,热爱学习!永远记得,达内将与你一同前行!现在扫码,立即领取万元课程礼包,助力0基础快速入行,为你梳理行业必备技能,全方位了解岗位发展前景!

【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。


友情链接: