我遇到了一个非常奇怪的问题。我的Tomcat每天都能以大约25%的CPU稳定运行24/7,但有些日子CPU却飙升到了60%,系统崩溃并无法恢复。
当我在减速期间拍摄线程转储时,几乎所有的线程都忙于某种字符串或相关操作。
没有OutOfMemory错误或任何异常被抛出,所有请求仍然得到处理,但响应时间恶化到极致,即使是一个次秒的请求也会变慢,需要60秒甚至更长时间。
我的服务器配置如下:
Ubuntu 12.04.2 LTS Linux 3.2.0-38-virtual #60-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux
java version "1.7.0_13" Java(TM) SE Runtime Environment (build 1.7.0_13-b20) Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
export JAVA_OPTS='-server -Xms18g -Xmx18g -XX:MaxPermSize=512m -XX:ThreadStackSize=512 -XX:NewRatio=1 -XX:SurvivorRatio=4 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -Xloggc:/usr/tomcat/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.awt.headless=true'
点击此处下载线程转储。我已经移除了大部分线程及其堆栈跟踪信息。
你有任何导致此问题的想法吗? 谢谢