JVM JIT编译器优化的限制

时间:2017-01-24 19:33:17

标签: java optimization jvm compiler-optimization jit

我目前正致力于从自定义DSL到Java的编译器,同时在此过程中执行一些粗略的性能优化。我最大的问题是没有学术资源可以找到关于JIT-Compilers在优化(通过)方面会做什么或者它们将做什么扩展(例如复杂的死代码消除,见下面的例子)。有很多博客文章称,由于某些时间限制,JIT-Compilers无法完成AOT编译器所做的所有优化,但没有人提及这实际意味着什么。有一般的经验法则吗?我是否需要潜入,例如OpenJDK C ++源码可以理解这个吗?对此有任何研究吗?如果没有,那么关于JVM JIT做什么样的优化,是否至少有可靠的资源?我发现的最新资源是Java 5,它已经过时了(http://www.oracle.com/technetwork/java/5-136747.html

这是一个复杂的死码消除的简化示例"鉴于变量cells_S_S_S没有在任何地方使用(请记住这是自动生成的代码),我发现JVM JIT无法消除的场景:

List<List<List<Cell>>> cells_S_S_S = new ArrayList<>(pla_S.size());
...
for (int pla_S_itr_45 = 0; pla_S_itr_45 < pla_S_size_45; ++pla_S_itr_45) {
        ...
        List<List<Cell>> cells_S_S = new ArrayList<>(tmpVarIf20_S.size());
        for (int tmpVarIf20_S_itr_44 = 0; tmpVarIf20_S_itr_44 < tmpVarIf20_S_size_44; ++tmpVarIf20_S_itr_44) {
            ...
            List<Cell> cells_S = _state.getCells();
            ...
            cells_S_S.add(cells_S);
        }
        ...
        cells_S_S_S.add(cells_S_S);
    }

这种嵌套的死代码&#34;没有消除,我自己进行了优化。

简而言之:我想知道JVM JIT的功能,以便我可以将自己的优化传递集中在正确的区域。

2 个答案:

答案 0 :(得分:2)

  

我想知道JVM JIT的功能,以便我可以将自己的优化传递集中在正确的区域。

简单回答:不要。

你必须考虑两件事:

  1. 是的,Oracle HotSpot JVM JIT引擎在多次通过期间执行各种优化。你列出的一些(死代码消除,内联,去虚拟化......等)等等 重要的是要注意JIT引擎的行为不是 来自其他公司的标准化和JVM以不同的方式运行。我从未见过一份文档全面描述了HotSpot如何在内部做出决策或支持优化列表,我非常怀疑这样的文档是否存在(不是来自Oracle,而是来自社区)。您可以深入了解HotSpot VM的来源,但是:
  2. HotSpot不断尝试在您的应用程序中确定热点并以非确定的方式决定需要进行哪些操作,如何在当前上下文中执行此操作(对于更热门的方法,它是有意义的应用昂贵的优化)并且需要丢弃并且可能重新编译的jitted方法 应用程序的状态不稳定,JIT引擎不断决定如何处理它,并根据当前环境选择应用哪组优化。
  3. 您正在尝试优化从DSL转换为特定JIT行为的代码,但您所做的每个假设都可能对一个特定的运行有效,但对另一个运行则无效。或者在一段时间后不再有效,当jit引擎决定放弃你的方法的jitted版本来释放内存或者用不同的结果再次编译它时。

    JIT和AOT之间的唯一区别在于,后者存在 no 时间限制,因此您尝试生成最佳代码,以获得一些质量指标。

答案 1 :(得分:0)

JIT优化实际上比整个程序优化功能强大得多。 JIT Optimization临时调整代码以实现最佳性能,并基于有关代码的假设进行极其不安全的优化。例如,JIT优化器可以预先计算某些内容,然后在假设错误的情况下将其回滚。 JIT内联器通过内联方法来帮助JIT优化器,使它们可以适应其特定的调用者。