5

我在Windows Server 2012 R2上使用带有jdk1.8.0_131的Tomcat 9.0.0.M22,并且我在其上部署了一个 Spring Boot Web 应用程序,问题是每 10 秒公共守护程序服务运行器会将cpu 峰值提高到50%我部署的 Web 应用程序处于空闲状态,然后降至 0%,并且此行为每 10 秒继续发生一次。

在我的应用程序中,我没有任何每 10 秒运行一次的作业,而且当我从 Eclipse 在 Tomcat 上运行我的 Web 应用程序时,我没有注意到相同的行为,所以我猜测这是一个 Tomcat 内置线程。

4

4 回答 4

1
  • 一旦 CPU 负载达到峰值,就执行一系列线程转储
  • 您可以使用jdk/bin/jvisualvm连接到您的 tomcat 并反复按下线程选项卡右上角的线程转储按钮,或者如果您更喜欢命令行(例如通过脚本),您也可以使用jdk/bin/jcmd <pid-of-your-tomcat> Thread.Print >> dumps.txt
  • 每个转储显示当时存在的所有线程,每个线程的堆栈跟踪显示正在执行的内容
  • 这应该会给您一些提示,创建该负载所涉及的内容
于 2017-09-15T12:37:41.010 回答
0

如果没有更多信息,这只是猜测,但这可能是垃圾收集器试图每十秒完成一次工作,但无法驱逐任何项目,因为它们仍然需要。您可以尝试增加 Tomcat (-Xmx) 的内存。

于 2017-09-18T15:14:07.600 回答
0

我可以通过在 context.xml 中设置 reloadable="false" 来完全阻止这种行为。

于 2019-03-27T12:49:39.163 回答
0

有了这么多信息,这非常困难,您可以想到几点:

  • 正如@jorg 指出的那样,您可以进行线程转储,这将为您提供有关任何阻塞线程的见解。
  • 您说它在本地系统上运行良好,并不一定意味着代码对于服务器平台是最佳的。仔细检查配置,maxThreads 等。
  • 通过消除任何过多的垃圾收集来优化服务器 JVM。使用更高的最大堆内存 (-Xmx) 启动 JVM 将降低垃圾收集发生的频率。
  • 现有的监控工具可以利用您的分析 ( jVisualVM )。
于 2017-09-18T17:01:52.723 回答