[Java][HotSpot VM] jstat -compiler的输出的含义

对编程语言的设计与实现有浓厚兴趣。喜欢把玩编译器与虚拟机。从事Spark SQL以及Databricks服务的研发;以前从事Java虚拟机与JavaScript虚拟机研发。

36 👍 / 8 💬

有同学问我说:

问个问题~~ 我们HotSpot,用jstat看JIT有很高的failed的比例。有没有什么文档讲为什么JIT compilation会fail,还有那个failed type到底是什么意思,以及identify哪些method有compilation failure的啊?我以前看到的那些书完全没有讲到这些啊(
难道这jstat说的failure,其实就是deoptimization的意思么…

嗯。很简单的问题,来回答一下。

这是关于Oracle/Sun JDK / OpenJDK自带的jstat工具的问题。其实我以前的blog上写过如何自己查找jstat的各种数据的含义,请跳这俩传送门:

jstat -compiler的一个示例输出:

$ jstat -compiler 55417
Compiled Failed Invalid   Time   FailedType FailedMethod
    6296      6       0    50.37          1  org/eclipse/jdt/internal/core/CompilationUnitStructureRequestor createTypeInfo

其中所使用的数据,由这个配置所定义:

8c93eb3fa1c0 src/share/classes/sun/tools/jstat/resources/jstat_options


option compiler {
  column {
    header "^Compiled^"		/* Number of compilation tasks performed */
    data sun.ci.totalCompiles
    scale raw
    align right
    width 6
    format "0"
  }
  column {
    header "^Failed^"		/* Number of failed compilation tasks */
    data sun.ci.totalBailouts
    scale raw
    align right
    width 6
    format "0"
  }
  column {
    header "^Invalid^"		/* Number of invalidated compilation tasks */
    data sun.ci.totalInvalidates
    scale raw
    align right
    width 6
    format "0"
  }
  column {
    header "^Time^"		/* Time spent in compilation */
    data java.ci.totalTime/sun.os.hrt.frequency
    align right
    scale sec
    width 8
    format "0.00"
  }
  column {
    header "^FailedType^"	/* Type of last failed compilation */
    data sun.ci.lastFailedType
    scale raw
    align right
    width 4
  }
  column {
    header "^FailedMethod"	/* Name of class and method for last failed compile */
    data sun.ci.lastFailedMethod
    scale raw
    align left
    width 1
  }
}

想知道这些列是什么意思,看看这个配置文件就知道。

它们都是通过HotSpot VM所支持的jvmstat API获取HotSpot VM内部的PerfCounter计数器的值,而相应计数器的名字就由配置文件里的data那项所指定。 有兴趣的同学可以在HotSpot VM的源码里搜搜下面的PerfCounter的名字,就可以知道在什么样的情况下这些计数器会被更新,于是就可以很清楚地知道计数器的含义。

关于那个FailedType列里的代号都是什么意思,请参考:

  // Compile type Information for print_last_compile() and CompilerCounters
  enum { no_compile, normal_compile, osr_compile, native_compile };

所以:

就这样。


专栏:编程语言与高级语言虚拟机杂谈(仮)

探讨编程语言的设计与实现