1. 調整JVM堆內存參數
在Tomcat的bin/catalina.sh文件中(Linux環境),通過JAVA_OPTS變量配置堆內存參數,這是優化內存使用的核心步驟。關鍵參數包括:
-Xms:設置JVM啟動時的初始堆內存(如-Xms512m),建議與-Xmx保持一致,避免堆內存頻繁擴容導致的性能波動;-Xmx:設置JVM可使用的最大堆內存(如-Xmx2G),通常建議為服務器物理內存的70%-80%(需預留內存給系統和其他進程);-Xss:設置每個線程的堆棧大?。ㄈ?code>-Xss256k),默認值通常足夠,過多線程會占用大量內存,需根據應用線程需求調整。JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256k"(-server啟用JDK的server模式,提升性能)。2. 優化非堆內存(方法區)參數
非堆內存主要用于存儲類元數據、常量池等,需通過以下參數調整:
-XX:PermSize:設置非堆內存初始大?。ㄈ?code>-XX:PermSize=128m),默認值為物理內存的1/64;-XX:MaxPermSize:設置非堆內存最大大?。ㄈ?code>-XX:MaxPermSize=256m),默認值為物理內存的1/4。OutOfMemoryError: PermGen space錯誤。3. 選擇合適的垃圾回收器并調優
垃圾回收(GC)是影響內存效率的關鍵環節,需根據應用特點選擇合適的GC算法:
-XX:+UseSerialGC,但并發能力弱,不適合高負載場景;-XX:+UseParallelGC(年輕代)和-XX:+UseParallelOldGC(老年代);-XX:+UseG1GC,并可通過-XX:MaxGCPauseMillis設置最大GC停頓時間(如-XX:MaxGCPauseMillis=200)。jstat -gcutil <pid>或jvisualvm等工具監控GC頻率和耗時,確保GC停頓時間不影響應用響應。4. 配置Tomcat線程池參數
線程池的配置直接影響內存使用和并發處理能力,需在conf/server.xml中調整Connector節點的參數:
maxThreads:設置最大線程數(如maxThreads="300"),表示Tomcat能同時處理的請求數量,需根據服務器CPU核心數和應用處理能力調整(建議為CPU核心數的2-4倍);minSpareThreads:設置最小空閑線程數(如minSpareThreads="50"),保持一定數量的空閑線程,避免頻繁創建線程的開銷;acceptCount:設置請求隊列長度(如acceptCount="300"),當所有線程都在處理請求時,新請求會進入隊列,隊列滿則拒絕請求。<Connector port="8080" protocol="HTTP/1.1" maxThreads="300" minSpareThreads="50" acceptCount="300" ... />。5. 禁用不必要的功能與優化連接器
conf/server.xml中將autoDeploy設置為false,避免Tomcat定期掃描應用目錄導致的資源消耗;conf/catalina.properties中添加org.apache.catalina.startup.ContextConfig.jarsToSkip=*.jar,跳過JAR包中的TLD文件掃描,減少內存占用;protocol="org.apache.coyote.http11.Http11NioProtocol"),提升高并發下的性能;protocol="org.apache.coyote.http11.Http11Nio2Protocol"啟用HTTP/2,減少協議開銷,提升傳輸效率。6. 使用系統級資源限制
通過Linux系統工具限制Tomcat的內存使用,避免單個進程占用過多內存導致系統崩潰:
sudo cgcreate -g memory:/tomcat
echo "2G" | sudo tee /sys/fs/cgroup/memory/tomcat/memory.limit_in_bytes
echo <Tomcat_PID> | sudo tee /sys/fs/cgroup/memory/tomcat/tasks
/etc/systemd/system/tomcat.service),在[Service]部分添加MemoryMax=2G,然后執行systemctl daemon-reload和systemctl restart tomcat;ulimit -v限制虛擬內存大?。ㄈ?code>ulimit -v 2000000,單位為KB),添加到Tomcat啟動腳本(如startup.sh)中。注意事項
jconsole、VisualVM或Prometheus+Granafa),根據實際情況調整參數。