我有一个 Java 7 的 Java Servlet 应用程序,通常在系统资源消耗方面非常健康。 通常情况下,服务器上的 CPU 使用率低于 50%。 然而,在启动后的几分钟内,它的行为会有很大不同,如果在此期间尝试服务大量流量,则 CPU 可以被固定在 100% 多达数分钟。 结果是响应时间变慢,网络超时甚至长时间的垃圾回收暂停。
为了诊断问题,我在服务器启动时进行了一系列线程转储,并同时运行了 top -H 命令。 通过将每个 Java 线程与 pid 匹配,我可以始终看到 C2 CompilerThread 使用最多的 CPU。 我已经研究了这个线程的作用,并且我知道它是一个基于运行时统计信息优化代码的 Java 编译器。 但是从我所做的所有阅读中,我无法确定使情况变得更好的最佳方法。 我能得出的唯一选项是:
1. 从 C2 切换到 TieredCompiler(但这是否会导致启动后的前几分钟性能更好?) 2. 打开 -XX:+PrintCompilation 以查看正在进行的优化(但我该如何处理这些信息?我能否在服务器接受流量之前强制进行优化?)
应该采取什么最佳方法,还有其他选项可以尝试以缓解启动后的 CPU 使用情况吗?
为了诊断问题,我在服务器启动时进行了一系列线程转储,并同时运行了 top -H 命令。 通过将每个 Java 线程与 pid 匹配,我可以始终看到 C2 CompilerThread 使用最多的 CPU。 我已经研究了这个线程的作用,并且我知道它是一个基于运行时统计信息优化代码的 Java 编译器。 但是从我所做的所有阅读中,我无法确定使情况变得更好的最佳方法。 我能得出的唯一选项是:
1. 从 C2 切换到 TieredCompiler(但这是否会导致启动后的前几分钟性能更好?) 2. 打开 -XX:+PrintCompilation 以查看正在进行的优化(但我该如何处理这些信息?我能否在服务器接受流量之前强制进行优化?)
应该采取什么最佳方法,还有其他选项可以尝试以缓解启动后的 CPU 使用情况吗?