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

9

最近在使用-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)   

你知道这是什么意思吗?它似乎在0和3之间变化,本地方法始终为0,其他方法始终为非零。


3
http://alexandrastech.blogspot.com/2016/06/jit-fun-part-3-xxprintcompilation.html - Sotirios Delimanolis
@SotiriosDelimanolis - 回答了我的问题,所以这已经足够作为一个答案了。 - BeeOnRope
1
我对编译器层面不是很了解。我会让有更多经验的人给出更详细的答案。 - Sotirios Delimanolis
1
@SotiriosDelimanolis - 好的。如果没有人回答,我就自己写吧。公正地说,你不一定需要成为一个专家来撰写答案,但我仍然感谢你的评论。 - BeeOnRope
1个回答

10

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

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

下面是分层编译流程的示意图。您可以在此回答中找到解释。

HotSpot Tiered Compilation

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

  • 级别0——解释器
  • 级别1——C1进行完全优化(无分析)
  • 级别2——C1使用调用和回边计数器
  • 级别3——C1进行完整分析(级别2 + MDO)
  • 级别4——C2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接