java - -XX :+PrintCompilation output? 中的这个新列是什么

标签 java optimization java-8 jvm-hotspot

最近在使用 -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,而其他方法始终为非零。

最佳答案

这是分层编译模式下的

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

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

HotSpot Tiered Compilation

更多详细信息可以在 HotSpot source code comments 中找到,它定义了如下级别:

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

关于java - -XX :+PrintCompilation output? 中的这个新列是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41134037/

相关文章:

java - 如何从Viewpager返回值: OnPageSelected?

java - 识别当前正在处理的元素

java - Android中如何正确升级AIDL接口(interface)?

java - 为什么这个 Java 程序的第 17 行没有被执行?

algorithm - 平铺不同大小的矩形

c++ - boost Weak_Ptr : Destruction is more expensive than expected

performance - 使用框阴影时站点速度极慢,但仅在 Mac 上?

java - 如何使用线程池读取多个文件?

java - 使用流Java 8在List Java中修改

java - 用于显示 ProgressBar 的弹出窗口未在 JavaFX 中显示