-XX:+ PrintCompilation输出中的新列是什么?

Bee*_*ope 8 java optimization jvm-hotspot java-8

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

          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)   
Run Code Online (Sandbox Code Playgroud)

任何线索是什么意思?它似乎在0到3之间变化,本机方法总是0,其他方法总是非零.

apa*_*gin 10

这是分层编译模式中的一个.

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

以下是分层编译流程的样子.您可以在此答案中找到解释.

HotSpot分层编译

可以在HotSpot源代码注释中找到更多详细信息,该注释定义了以下级别:

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