今天我的一位朋友告诉我,如果一条指令是invoke virtual,那么它总是动态绑定,而invokespecial总是静态绑定?这是真的吗?
如果是,那么为什么当带有final关键字的方法也调用virtual时呢?
请澄清我的这个疑问
从本质上讲,是的,你是对的。有趣的部分是 Hotspot 的引入。 Hotspot 本质上是另一个编译器,它知道当前加载了哪些类,更可怕的是,它知道何时加载新类,并且可以使用更新的知识动态重新编译。 Hotspot 可能会选择使用 javac 无法获得的知识来执行删除动态调度的优化。添加Hotspot后,javac中的代码得到了简化。 Sun 剥离了很多逻辑,主要是优化部分。
因此,为了回答您的问题,javac 并没有过多关注方法的最终关键字。它遵循它的大哥 Hotspot。
Oracle 在此处记录了 Hotspot 执行的一些优化:https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques。请查看方法部分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)