如何知道在热点中编译 class 或方法花费了多少时间?

How to know how much time spent on compile a class or method in hotspot?

1,我想知道在JIT期间编译一个class或者hotspot中的方法花费了多少时间(我们遇到了一些超时问题,我们怀疑这可能是编译时间过长造成的)?这次有没有trace flag或者其他方式可以追踪到?

2,顺便说一句,如果方法运行是第一次,那么编译时间应该是0,因为完全没有编译过程,对吧?

JVM 标志:-XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation2

    289  425       4       java.time.LocalDate::until (116 bytes)
    292  360       3       java.time.ZoneId::of (85 bytes)   made not entrant
    293  426       4       java.time.LocalDate::from (68 bytes)
    293  386       3       java.time.LocalDate::from (68 bytes)   made not entrant
    293  426   size: 248(96) time: 0 inlined: 54 bytes
    297  425   size: 3688(2272) time: 8 inlined: 1092 bytes
     ^    ^          ^                ^          ^
     |    |          |                |          |
     |    |          compiled bytes   |          bytecodes inlined
     |    compilation ID              method compilation time (ms)
     timestamp (ms from JVM start)

注意

  • 当应用程序 运行 时,JIT 编译器在后台工作;它不太可能导致延迟或超时。
  • 通常有多个编译器线程; PrintCompilation 输出可能会交错。
  • 一个方法可能会被(重新)编译多次,但优化程度不同。

jitwatch可以记录并展示jit编译日志