问个问题~~ 我们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 };
所以:
就这样。
原文作者:;如有侵权,请联系管理员删除。