【问题标题】:What's this new column in -XX:+PrintCompilation output?-XX:+PrintCompilation 输出中的这个新列是什么?
【发布时间】:2017-04-29 06:39:57
【问题描述】:

最近在使用-XX:+PrintCompilation(JDK 8r111)检查方法编译时,我注意到documentation 中没有出现一个新列,我可以find 讨论该主题:

          this column
               |
               |
               v
600    1  s    3       java.util.Hashtable::get (69 bytes)
601    4       3       java.lang.Character::toLowerCase (6 bytes)
601    8       3       java.io.UnixFileSystem::normalize (75 bytes)
602   12       3       java.lang.ThreadLocal::get (38 bytes)
602   14       3       java.lang.ThreadLocal$ThreadLocalMap::getEntry (42 bytes)
602   18       2       java.lang.String::startsWith (72 bytes)
602   10       4       java.lang.String::equals (81 bytes)
602    2 %     4       java.lang.String::hashCode @ 24 (55 bytes)
602   16  s!   3       sun.misc.URLClassPath::getLoader (197 bytes)
603   23     n 0       java.lang.System::arraycopy (native)   (static)
604   27     n 0       sun.misc.Unsafe::getObjectVolatile (native)   

知道这意味着什么吗?它似乎在 0 和 3 之间变化,原生方法总是 0,而其他方法总是非零。

【问题讨论】:

  • @SotiriosDelimanolis - 回答了我的问题,因此足以回答。
  • 我不是编译器级别的专家。我会让有更多经验的人给出更详细的答案。
  • @SotiriosDelimanolis - 很公平。没有人写我自己写。公平地说,您不一定需要成为专家才能撰写答案,但我仍然感谢您的评论。

标签: java optimization java-8 jvm-hotspot


【解决方案1】:

这是一个处于分层编译模式的

  • 在第 1、2、3 层,代码由 C1 编译,具有不同数量的额外分析。这听起来可能违反直觉,但其中最优化的是第 1 层,因为它没有分析开销(也没有机会进一步优化)。
  • 在第 4 层,代码由 C2 编译。要生成高度优化的代码,C2 需要在第 3 层或解释期间收集执行统计信息。

这是分层编译流程的样子。你可以在this answer找到解释。

更多细节可以在HotSpot source code comments中找到,它定义的级别如下:

  • 0 级 - 解释器
  • 1 级 - 完全优化的 C1(无分析)
  • 2 级 - C1 带调用和后端计数器
  • 3 级 - 具有完整分析的 C1(2 级 + MDO)
  • 4 级 - C2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2011-02-25
    • 1970-01-01
    • 2022-11-16
    • 2021-04-30
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多