And*_*niy 3 java optimization jit java-8
在java-8源代码中,我们可以在类中找到相当棘手的JIT优化方法Class:
/*
* Private constructor. Only the Java Virtual Machine creates Class objects.
* This constructor is not used and prevents the default constructor being
* generated.
*/
private Class(ClassLoader loader) {
// Initialize final field for classLoader. The initialization value of non-null
// prevents future JIT optimizations from assuming this final field is null.
classLoader = loader;
}
Run Code Online (Sandbox Code Playgroud)
因此,永远不会调用此构造函数,但JIT将被此欺骗"欺骗".
我的问题是:它可以用稍微不同的方式实现,比方说
private Class() {
classLoader = (ClassLoader)(new Object());
}
Run Code Online (Sandbox Code Playgroud)
这绝对是毫无意义的逻辑,但是如果永远不会调用构造函数那么重要吗?
这种技巧会阻止JIT进行这种优化吗?
在Java 6和Java 7(以及更新40之前的Java 8)中,构造函数非常简单private Class() {},但在这些版本中,也没有classLoader字段.
这意味着,之间的关联Class,并ClassLoader曾在一个特殊的JVM特定的方式来维持,因此,getClassLoader()还打电话叫成native方法,但不一定涉及的JNI,而是处理作为一个JVM内在的操作,但仍然需要内部JVM的本地特殊照顾码.此外,垃圾收集器必须知道特殊关系.
相比之下,在Reflection中隐藏字段并不复杂,而现在拥有普通字段简化了JVM的本机代码,最明显的是getClassLoader()操作和垃圾收集器实现.如果优化器是普通字段,则内联访问也可能更简单.
现在,当Class通过特殊的JVM代码创建对象时,不使用声明的构造函数,它可能与优化JIT的假设相矛盾,这些假设是通过分析构造函数的实际代码来预测此final字段的可能值.
请注意,没有人说当前的JIT是那么聪明.该评论讨论了假设的" 未来JIT优化 ".使用参数值初始化字段的构造函数与JVM实际执行的操作一致.
相反,像您建议的构造函数classLoader = (ClassLoader)(new Object());可能会导致假设的优化器得出结论,该字段无法使用实际ClassLoader实例进行初始化,因为该代码永远无法正常完成.
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |