JVM 方法调用
JVM 对于方法的优化处理
Java 识别重载方法
在不考虑对基本类型自动拆装箱,以及可变长参数的情况下,选取重载方法。
如果 1 没有找到,那么在允许自动拆装箱,但不允许可变长参数的情况下,选取重载方法。
如果 2 也没有找到,那么在允许自动拆装箱以及可变长参数的情况下,选取重载方法
如果 Java 同时找到多个适配的方法,那么它会选择其中最为贴切的一个,而决定贴切程度的关键就是形式参数类型的继承关系。
JVM 识别方法
JVM 识别方法: 类名 + 方法名 + 方法描述符(方法的参数类型+返回类型)
静态绑定:JVM 在解析时,便能够直接识别目标方法
动态绑定:JVM 在运行过程中,根据调用者的动态类型来识别目标方法
Java 字节码中与调用相关的指令:
invokestatic:用于调用静态方法
invokespecial:用于调用私有实例方法、构造器、以及使用 super 关键字调用ß私有实例方法或构造器,和所实现接口的默认方法
invokevirtual:用于调用非私有实例方法
invokeinterface:用于调用接口方法
invokedynamic:用于调用动态方法
如果虚拟机能够确定目标方法有且仅有一个,目标方法被标记为 final,那么可以不通过动态类型,直接静态绑定,确定目标方法。
在编译过程中,JVM 会暂时用符号引用来表示目标方法。符号引用包括目标方法的类或接口名、方法名以及方法描述符。
虚方法调用过程
虚方法调用=invokevirtual + invokeinterface
动态绑定实现原理 核心就是方法表
解释执行
方法表:子类方法表中包含父类方法表中的所有方法的索引;子类方法在方法表中的索引值,与它所重写的父类方法的索引值相同。
即时编译
内联缓存:能够缓存虚方法调用中调用者的动态类型,以及该类型所对应的目标方法。在之后的执行过程中,如果碰到已缓存的类型,内联缓存会直接调用该类型所对应的目标方法;否则,退化成使用基于方法表的动态绑定。
方法内联:在编译过程中,遇到方法调用时,将目标方法的方法体纳入编译范围内,并取代原方法调用的优化手段。
版权声明: 本文为 InfoQ 作者【技术小生】的原创文章。
原文链接:【http://xie.infoq.cn/article/22e1c0bf29f8c3b1ecabdabdc】。文章转载请联系作者。
评论