有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    ThreadStop是在全局安全点执行的VM操作,用于将异步异常传递给某个线程

    从JDK 11开始,这种操作有两个常见原因:

    • ^{}方法,该方法将异步ThreadDeath错误传递给给定线程
    • JVM TI^{}函数

    async-profiler将有助于找到ThreadStop的起始位置

    要开始分析异步异常,请运行

    ./profiler.sh start -e Thread::send_async_exception <PID>
    

    然后,在一个或多个ThreadStop发生后,停止分析并获得结果:

    ./profiler.sh stop -f result.html <PID>
    

    ThreadStop profile

    例如,这里我们看到Tomcat在重新加载web应用程序时调用Thread.stop。如果应用程序本身没有正常停止所有线程,并且clearReferencesStopThreads属性设置为true,就会发生这种情况。详情见Context Configuration Reference