java在加载时冻结JVM/Tomcat,而safepointlog记录使用safepoints“ThreadStop”条目
我对在Tomcat中运行的Java应用程序有一个问题,Tomcat使用openJDK11运行。问题是,在高负载下运行一段时间后,应用程序会冻结。CPU负载也随之崩溃,不再在Catalina中写入任何条目。删除或删除应用程序日志文件。一段时间(1-2分钟)后,系统恢复并正常运行
我首先认为垃圾收集有问题,然后开始记录垃圾收集和安全点
在Safepoint日志中,冻结时间有数百到数千条条目(不中断其他消息):
[2021-02-03T08:53:44.619+0100][5136.564s][info][safepoint] Application time: 0.0153146 seconds
[2021-02-03T08:53:44.620+0100][5136.565s][info][safepoint] Entering safepoint region: ThreadStop
[2021-02-03T08:53:44.621+0100][5136.566s][info][safepoint] Leaving safepoint region
[2021-02-03T08:53:44.621+0100][5136.566s][info][safepoint] Total time for which application threads were stopped: 0.0020579 seconds, Stopping threads took: 0.0006463 second
ThreadStop消息与冻结时间的比例为1:1。因此,假设螺纹止动块是问题的原因
不幸的是,我找不到任何关于ThreadStop安全点的信息
因此,问题是什么触发了ThreadStop安全点?它们是造成冰冻的原因吗?如果是,我该如何解决这个问题
非常感谢
# 1 楼答案
ThreadStop
是在全局安全点执行的VM操作,用于将异步异常传递给某个线程从JDK 11开始,这种操作有两个常见原因:
ThreadDeath
错误传递给给定线程李>async-profiler将有助于找到
ThreadStop
的起始位置要开始分析异步异常,请运行
然后,在一个或多个
ThreadStop
发生后,停止分析并获得结果:例如,这里我们看到Tomcat在重新加载web应用程序时调用
Thread.stop
。如果应用程序本身没有正常停止所有线程,并且clearReferencesStopThreads
属性设置为true
,就会发生这种情况。详情见Context Configuration Reference