C2编译器在启动时使CPU饱和

Cam*_*ron 6 java performance jvm

我在Java 7上有一个java servlet应用程序,它通常在系统资源消耗方面非常健康.通常,服务器上的CPU使用率低于50%.然而,在启动后的几分钟内,它的行为有很大不同,以至于如果CPU在此期间尝试提供大量流量,则可以在几分钟内将其固定为100%.结果是响应时间慢,网络超时,甚至有时长时间的垃圾收集暂停.

为了诊断问题,我在服务器启动时进行了一系列线程转储,同时运行了顶级-H.通过将每个java线程与pid相匹配,我可以始终看到C2 CompilerThread使用到目前为止最多的CPU.我已经研究了这个线程的作用,我理解它是一个基于运行时统计信息优化代码的Java编译器.但是从我所做的所有阅读中,我无法说出改善情况的最佳方法.我能收集到的唯一选择是:

  1. 从C2切换到TieredCompiler(但这会在启动后的前几分钟内获得更好的性能吗?)
  2. 打开-XX:+ PrintCompilation以查看正在优化的内容(但我如何处理此信息?在服务器以某种方式接受流量之前,我可以强制优化它吗?)

什么是最好的方法,还有其他选择尝试和缓解启动后的CPU使用率?

小智 1

有几种付费 JVM 技术可以使用提前编译来缓解您的问题。

然而,如果您想坚持使用标准 JVM,人们使用的一个技巧是在启动后发送一些虚拟请求,以便 JVM 在实际操作开始之前预热。这样您就可以在为客户提供服务之前决定何时支付 JVM 预热费用。

您还可以通过热点的 -Xcomp 命令行选项强制 JVM 编译所有代码,但我们不建议这样做,因为它会编译很少使用的代码,从而减慢应用程序的启动速度。