java - 调用虚拟总是动态绑定(bind)吗?

标签 java

今天我的一个 friend 告诉我,如果一条指令是 invoke virtual 它总是动态绑定(bind),而 invoke special 总是静态绑定(bind)?是真的吗?

如果是,那么为什么当带有 final 关键字的方法也调用 virtual 时呢?

请澄清我的疑惑

最佳答案

本质上,是的,你是对的。有趣的部分是 Hotspot 的引入。 Hotspot 本质上是另一个编译器,它知道当前加载了哪些类,更可怕的是它知道何时加载新类,并且可以根据更新的知识即时重新编译。 Hotspot 可能会选择使用 javac 不可用的知识来执行删除动态调度的优化。添加 Hotspot 后,简化了 javac 中的代码。 Sun 剥离了很多逻辑,主要是优化部分。

因此,为了回答您的问题,javac 并没有过多关注方法的 final 关键字。它服从于它的大哥 Hotspot。

Oracle 在此处记录了 Hotspot 执行的一些优化:https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques .查看方法部分。

关于java - 调用虚拟总是动态绑定(bind)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24551648/

相关文章:

java - 如何在 getopt 类中给 optarg 值 b*

java - Spring Boot 无法扫描多个模块的注释

java - Java 中的全局代码初始化

java - 随机播放方法会导致重复模式吗?

java - 从java中找到java.exe位置

java - 使用AOP拦截Spring社交控制

java - JPA 多对一在引用表中具有常量值

Java:子类构造函数完成后的后处理

java - Swingworker 产生重复输出/输出无序?

java - sqlite 日期时间格式 : which one is better?