一、优化JVM内存配置,避免内存溢出
JVM内存设置是Tomcat稳定的核心基础,不合理的内存分配易导致内存溢出(OOM),使服务崩溃。需通过catalina.sh(CentOS下位于/opt/tomcat/bin/)调整关键参数:
-Xms(初始堆)和-Xmx(最大堆)设为相同值(如-Xms2048m -Xmx2048m),避免JVM频繁扩容堆内存导致的性能波动;建议值为物理内存的1/4~1/2(如8GB内存可设为2~4GB)。-Xmn为堆内存的3/8(如-Xmn768m),可优化Minor GC效率。-XX:MaxMetaspaceSize替代MaxPermSize(如-XX:MaxMetaspaceSize=256m),防止元空间溢出。-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/temp/oom.hprof,当OOM发生时自动生成堆转储文件,便于后续分析内存泄漏原因。二、配置Tomcat集群与负载均衡,消除单点故障
单节点Tomcat易因硬件故障或进程崩溃导致服务中断,需通过集群和负载均衡提升可用性:
/etc/nginx/nginx.conf,添加如下配置:upstream tomcat_cluster {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}
server {
    listen 80;
    location / {
        proxy_pass http://tomcat_cluster;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
重启Nginx(systemctl restart nginx)使配置生效。server.xml中启用集群(<Cluster>标签),并设置jvmRoute(如<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1">);在应用的web.xml中添加<distributable/>,确保会话数据在集群节点间同步。/etc/keepalived/keepalived.conf,添加如下配置:vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.1.200
    }
}
重启Keepalived(systemctl restart keepalived),VIP(192.168.1.200)将指向主节点,故障时自动切换。三、优化日志管理与存储,避免磁盘空间耗尽
日志文件过大或未合理轮转会占满磁盘,导致Tomcat无法写入日志甚至崩溃:
logrotate工具管理Tomcat日志(如catalina.out)。创建/etc/logrotate.d/tomcat文件,添加如下配置:/opt/tomcat/logs/catalina.out {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}
该配置表示每天轮转一次日志,保留最近7天的压缩日志(catalina.out.1.gz~catalina.out.7.gz),并清空原日志文件。conf/logging.properties,将ConsoleHandler替换为AsyncFileHandler,提升日志写入性能(减少对主线程的阻塞):handlers = 1catalina.org.apache.juli.AsyncFileHandler
.handlers = 1catalina.org.apache.juli.AsyncFileHandler
1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
logging.properties调整日志级别(如将org.apache.catalina设为WARNING),减少调试日志的输出;或在server.xml中关闭Access Log(<Valve className="org.apache.catalina.valves.AccessLogValve" enabled="false"/>)。四、调整Tomcat连接器与线程配置,提升并发处理能力
Tomcat的连接器(Connector)配置直接影响并发性能,不合理配置会导致请求堆积、响应超时:
conf/server.xml中的<Connector>标签,调整关键参数:<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxThreads="500"
           minSpareThreads="50"
           acceptCount="1000"
           enableLookups="false"
           compression="on"
           compressionMinSize="2048"
           compressableMimeType="text/html,text/xml,text/plain,application/json" />
maxThreads:最大线程数(如500),根据并发请求数调整(建议为CPU核心数的2~4倍);acceptCount:等待队列长度(如1000),当所有线程繁忙时,新请求进入队列;enableLookups="false":禁用DNS查询,提升请求处理速度;compression="on":启用GZIP压缩,减少传输数据量(适用于文本类响应)。<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
需在Nginx中配置proxy_pass指向AJP端口(如proxy_pass http://127.0.0.1:8009)。五、定期监控与维护,及时排查问题
主动监控Tomcat运行状态,提前发现潜在问题(如内存泄漏、线程阻塞、磁盘空间不足):
top、htop、free -m命令实时查看CPU、内存、磁盘使用情况;或使用第三方工具(如Prometheus+Grafana)搭建监控面板,设置阈值告警(如内存使用率超过80%时发送邮件通知)。jstat -gcutil <pid> 1000命令每秒监控GC情况(如Eden区、老年代使用率),或使用VisualVM、JConsole工具查看堆内存、线程状态。temp、work目录会积累临时文件,需定期清理(如每月执行rm -rf /opt/tomcat/temp/*、rm -rf /opt/tomcat/work/*)。六、升级Tomcat版本与依赖,修复已知漏洞
旧版本Tomcat可能存在性能bug或安全漏洞,影响稳定性:
lib目录下未使用的jar包(如旧版本的数据库驱动),减少内存占用和潜在的类冲突。