如何知道在热点中编译 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编译日志
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编译日志