在優化前,需先定位內存瓶頸。通過查看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%,需預留內存給系統和其他進程)。-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頻率),避免一次性調整過多導致性能波動。