如何知道在热点中编译类或方法花费了多少时间?
问题描述:
1,我想知道在JIT期间花费多少时间在热点上编译类或方法(我们遇到了一些超时问题,并且我们怀疑这可能是由于编译时间过长造成的)?有没有跟踪标志或其他方式来跟踪这一次?如何知道在热点中编译类或方法花费了多少时间?
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
输出可能会出现交错。 - 一种方法可以用不同级别的优化(重新)编译多次。
我们得到了刚刚部署\启动应用程序后,我们的客户有许多超时错误时有大量的客户端请求并发的问题,所以我们想,也许通过长时间类负载或方法造成的问题编译,我不知道这个故障排除的方向是否正确,你能否提出一些建议? –
顺便说一句,当编译的方法,如果该方法的请求将被阻止?或者它仍在执行解释,编译完成后切换到编译版本? –
@Jason编译不会阻止执行的方法。它在后台完成,而方法被解释。 – apangin