关于问题:
在 VM 中的大量 IO 期间,由于停止线程需要更多时间,我们面临 JVM 暂停/缓慢。查看安全点日志时,它显示同步状态花费的时间最多。
我们还尝试在超时延迟 (-XX:+SafepointTimeout -XX:SafepointTimeoutDelay=200) 上打印安全点跟踪,以了解哪些线程导致了此问题,但似乎没有任何可疑之处。此外,在为安全点设置超时时,当花费的时间处于“同步”状态时,我们不会检测到超时打印。
关于此安全点跟踪的问题:
- 安全点超时如何工作?
- 记录线程详细信息后,安全点是否存在并且所有线程都恢复了?
- 是否会执行该 VM 操作。如果 vmop 是 GC 会发生什么。
使用 Async-profiler:
尝试使用 async-profiler 进行时间到安全点分析,并注意到 VM 线程在 SafepointSynchronize::begin() 方法上花费了更多时间,而 C2 编译器线程与 VM 线程花费的时间几乎相同。
我们怀疑 C2 编译器可能需要时间才能达到安全点。有人可以帮助我们解决这个问题并解释这个安全点时间火焰图吗?提前致谢。