java – JVM JIT可以专门化子类中的非重写方法吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JVM JIT可以专门化子类中的非重写方法吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2852字,纯文字阅读大概需要5分钟。
内容图文
好吧,那个标题不能得到这个想法,但基本上我的意思是给定一个类中的方法m()在某个子类Derived中没有被覆盖,是当前JVMs1中能够“专门化”的JIT编译器“0 m()无论如何有意义,或者派生谁继承并且不覆盖Base.m()共享相同的编译代码?
这种特殊化是有道理的,派生类定义了使m()更简单的东西.例如,为了讨论的目的,让我们说m()调用另一个成员函数n(),并且在派生类中定义n(),这样当n()内联到m()中时,后者被大大简化.
具体来说,请考虑遵循以下类中的两个非抽象方法(它们都是m() – 类型方法,而抽象方法是相应的n()方法):
public class Base {
abstract int divisor();
abstract boolean isSomethingEnabled();
int divide(int p) {
return p / divisor();
}
Object doSomething() {
if (isSomethingEnabled()) {
return slowFunction();
} else {
return null;
}
}
两者都依赖于抽象方法.让我们说你现在有这样的派生:
public class Derived extends Base {
final int divisor() {
return 2;
}
final boolean isSomethingEnabled() {
return false;
}
}
现在,divide()和doSomething()方法的有效行为非常简单,除法不是任意数字的完全除法,而是可以通过位操作完成的一半. doSomething()方法始终返回false.我假设当JIT去编译divide()或doSomething()时,如果Derived是唯一的子类,一切都很好:两个抽象调用只存在(当前)一个可能的实现,并且CHA将启动并内联只有可能的实现,一切都很好.
然而,在更一般的情况下,存在其他派生类,我不清楚JVM是否只会使用对抽象方法的invokevirtual调用在Base中编译方法的one2版本,或者它是否足够聪明地说,“嘿,即使Derived没有覆盖divisor(),我应该专门为它编译一个版本,因为它会变得更简单”.
当然,即使没有专门的重新编译,积极的内联通常也会使其工作正常(即,当你在已知或甚至可能是Derived的类上调用divide()时,内联可能会为您提供良好的实现但是,同样地,有很多情况下没有这样的内联.
0我的专业化并不意味着除了编译适用于某个受限域的函数的另一个版本之外的任何具体内容,同样意义上说内联是特定调用站点的一种特殊化形式,或者与大多数函数相同的方式有点专门针对当前上下文(例如,加载类,关于null的假设等).
1尤其是,当一个人说“JVM可以,等等吗?”一个人通常在谈论Hotspot,我也主要在Hotspot,但也有任何其他JVM也能做到这一点.
2OK确定,你可能有多个版本的函数,用于堆栈替换,用于不同的编译器级别,当进行去优化时等等…
解决方法:
> HotSpot JVM最多只有一个当前的进入版本的编译方法.从源代码中的Method和nmethod实体之间的一对一关系可以看出这一点.但是,可能存在多个非进入的先前版本(例如,在较低层和OSR存根处编译的nmethod).
>此单个编译版本通常针对基于运行时分析的最常见情况进行优化.例如,在对Base.doSomething()进行概要分析时,JIT看到始终在Derived实例上调用isSomethingEnabled()(即使有更多的子类),它将优化对快速情况的调用,留下一个不常见的陷阱一.在此优化之后,doSomething()将如下所示
if (this.getClass() != Derived.class) {
uncommon_trap(); // this causes deoptimization
}
return false;
>为每个分支和每个呼叫站点单独收集配置文件数据.这使得可以针对一个接收器优化(专门化)方法的一部分,并且针对不同的接收器优化(专门化)另一部分.
>如果在分析期间检测到两个不同的接收器,JIT可以内联两个通过类型检查保护的被监护者.
>将使用vtable查找编译具有两个以上接收器的虚拟调用.
要查看方法配置文件数据,请在JVM的调试版本中使用-XX:PrintMethodData选项.
内容总结
以上是互联网集市为您收集整理的java – JVM JIT可以专门化子类中的非重写方法吗?全部内容,希望文章能够帮你解决java – JVM JIT可以专门化子类中的非重写方法吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。