【问题标题】:JIT optimization preventing techniquesJIT优化预防技术
【发布时间】:2017-06-25 03:30:54
【问题描述】:

java-8 来源中,我们可以在Class 类中找到相当棘手的 JIT 优化方法:

/*
 * 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;
}

所以,这个构造函数永远不会被调用,但是 JIT 会被这个技巧“欺骗”。

我的问题是:比方说,它可以以稍微不同的方式实现吗

private Class() {
    classLoader = (ClassLoader)(new Object());
}

这绝对是毫无意义的逻辑,但构造函数是否永远不会被调用有关系吗?

这样的伎俩是否也会阻止 JIT 进行这种优化?

【问题讨论】:

  • 我无法完全想象它被用在原生代码之外的任何地方,特别是因为它不是类型安全的构造函数。
  • @Makoto classLoader 你的意思是字段?
  • 不,我的意思是这个私有构造函数。我在任何 Java 库中都找不到它的用途,我怀疑我们凡人会想要使用它,因为它不是类型安全的 Class 实例。请记住:Class 定义为 Class<T>
  • 我很抱歉,但这个事实与我的问题有什么关系?我在问关于 JIT 优化如何阻止工作的方法?
  • 好的,我将删除关于volatile的部分问题,看起来有点傻

标签: java optimization java-8 jit


【解决方案1】:

Class 源代码中的注释指出初始化值使未来的 JIT 优化知道classLoader 字段不为空。因此优化器将来可能会做得更好.

为防止优化,只需声明您的字段volatile

【讨论】:

    【解决方案2】:

    在 Java 6 和 Java 7(以及更新 40 之前的 Java 8)中,构造函数与 private Class() {} 一样简单,但在这些版本中,也没有 classLoader 字段。

    这意味着ClassClassLoader之间的关联必须以特殊的JVM特定方式维护,因此getClassLoader()必须调用native方法,不一定涉及JNI,而是处理作为 JVM 内在操作,但在 JVM 的本机代码中仍需要特别注意。此外,垃圾收集器必须知道特殊关系。

    相比之下,在 Reflection 中隐藏一个字段并没有那么复杂,而现在拥有一个普通字段可以简化 JVM 的本机代码,尤其是 getClassLoader() 操作和垃圾收集器实现。如果是普通字段,优化器内联字段访问也可能更简单。


    现在,当 Class 对象是通过特殊的 JVM 代码创建时,而不是使用声明的构造函数,它可能会与优化 JIT 的假设相矛盾,该假设是通过分析构造函数的实际代码来预测该 final 字段的可能值而做出的。

    请注意,没有人说当前的 JIT 如此聪明。该评论谈到了假设的“未来的 JIT 优化”。让构造函数使用参数值初始化字段,这符合 JVM 的实际操作。

    相比之下,像您建议的 classLoader = (ClassLoader)(new Object()); 这样的构造函数可能会导致假设的优化器得出结论,无法使用实际的 ClassLoader 实例初始化此字段,因为该代码永远无法正常完成。

    【讨论】:

    • 似乎早期版本的 Java 8 也没有 classLoader 字段。它used a native method.
    • @4castle: 好像是在更新 40 中添加的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2013-04-21
    • 2017-02-18
    相关资源
    最近更新 更多