在优化前,需先定位内存瓶颈。通过查看Tomcat日志(catalina.out)查找OutOfMemoryError(如Java heap space、PermGen space);使用JVM监控工具(如jconsole、jvisualvm、jstat -gcutil <pid> 1000)监控堆内存、老年代、元空间等使用情况;若怀疑内存泄漏,可通过jmap -dump:live,format=b,file=heapdump.hprof <pid>导出堆转储文件,再用jhat或MAT(Memory Analyzer Tool)分析泄漏对象。
修改Tomcat启动脚本catalina.sh(位于$CATALINA_HOME/bin),合理配置JVM内存参数:
-Xms2048m -Xmx2048m),避免堆内存动态调整带来的性能开销;数值需根据服务器物理内存调整(一般不超过物理内存的80%,需预留内存给系统和其他进程)。-Xmn512m),通常为堆内存的1/3~1/2,优化Minor GC效率。-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m,避免元空间溢出。-XX:PermSize=128m -XX:MaxPermSize=256m。-XX:+UseParallelGC(并行GC),低延迟选-XX:+UseG1GC(G1 GC,默认在Java 9+启用);示例:JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC"。通过server.xml中的<Executor>和<Connector>调整线程池,提升并发处理能力:
<Service>标签内添加<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="200" minSpareThreads="50" acceptCount="1000"/>(maxThreads:最大线程数,根据并发量调整;minSpareThreads:最小空闲线程,保持连接准备;acceptCount:等待队列长度,超过则拒绝请求)。<Connector>标签,添加executor="tomcatThreadPool",并启用NIO(protocol="org.apache.coyote.http11.Http11NioProtocol")和压缩(compression="on");示例:<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" compression="on" compressableMimeType="text/html,text/xml,text/plain,application/json"/>。/etc/security/limits.conf,添加* soft nofile 65535和* hard nofile 65535,提高Tomcat进程能打开的文件数(避免高并发时文件描述符耗尽)。/etc/rc.local,添加echo never > /sys/kernel/mm/transparent_hugepage/enabled和echo never > /sys/kernel/mm/transparent_hugepage/defrag,然后重启服务器。/etc/sysctl.conf,添加net.core.somaxconn=65535(增加TCP连接队列长度)、net.ipv4.tcp_tw_reuse=1(复用TIME_WAIT连接)、fs.file-max=65536(增加系统最大文件描述符数);执行sysctl -p使配置生效。String拼接用StringBuilder代替+)。jstat -gcutil <pid> 1000监控GC频率和内存回收情况,top或htop监控Tomcat进程内存占用;通过jmxtrans+Grafana搭建可视化监控面板,实时查看内存、线程等指标。-Xmx,再调整-Xmn),观察应用性能变化(如响应时间、GC频率),避免一次性调整过多导致性能波动。