在Ubuntu系统上优化Tomcat内存,需从JVM内存配置、线程池调优、连接器优化、系统内核调整及监控分析等多维度入手,以下是具体步骤:
JVM内存设置是Tomcat内存优化的基础,需根据服务器物理内存大小调整,避免内存溢出(OOM)或频繁GC。
编辑启动脚本:
打开Tomcat的bin/catalina.sh
文件(若使用systemd
服务,建议创建bin/setenv.sh
文件),添加或修改以下参数:
export JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx2048m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC"
-server
:启用服务器模式JVM,提升多CPU环境下的性能;-Xms1024m
:初始堆内存(建议设为物理内存的1/4~1/2);-Xmx2048m
:最大堆内存(不超过物理内存的80%,避免占用过多系统内存);-XX:MaxMetaspaceSize=512m
(Java 8+):元空间最大大小(替代旧版本的PermSize
);-XX:+UseG1GC
:启用G1垃圾收集器(适合大内存堆,减少Full GC停顿时间)。注:若使用Java 7及以下版本,需将
MaxMetaspaceSize
替换为-XX:MaxPermSize=512m
。
可选:开启GC日志:
添加以下参数记录GC详情,便于后续分析:
export JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/tomcat/logs/gc.log"
线程池配置直接影响Tomcat并发处理能力,需平衡CPU与内存占用。
编辑conf/server.xml
中的<Connector>
标签,调整以下参数:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" maxThreads="200" minSpareThreads="50" acceptCount="250" enableLookups="false" URIEncoding="UTF-8" />
maxThreads="200"
:最大线程数(建议设为CPU核心数的2~4倍,如4核CPU设为8~16,高并发场景可适当增加);minSpareThreads="50"
:初始化时创建的空闲线程数(保证快速响应新请求);acceptCount="250"
:所有线程繁忙时的请求队列长度(避免拒绝服务,建议设为maxThreads
的1.2~1.5倍);enableLookups="false"
:禁用域名反查(减少DNS查询开销);URIEncoding="UTF-8"
:设置URL编码为UTF-8(避免中文乱码)。选择高性能连接器并启用HTTP/2,提升请求处理效率。
protocol
属性改为org.apache.coyote.http11.Http11NioProtocol
(默认已是NIO,无需修改,但需确认):<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" ... />
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
并开启HTTP/2:<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" sslEnabledProtocols="TLSv1.2,TLSv1.3" sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation" sslConfigFile="/path/to/tomcat/conf/ssl.conf"> <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> </Connector>
优化Ubuntu内核参数,提升Tomcat的网络与文件处理能力。
/etc/security/limits.conf
,添加以下行(允许单个用户最多打开65535个文件):* soft nofile 65535 * hard nofile 65535
生效命令:source /etc/security/limits.conf
。sudo sysctl -w net.core.rmem_max=1310720 sudo sysctl -w net.core.wmem_max=1310720 sudo sysctl -w net.ipv4.tcp_tw_reuse=1 sudo sysctl -w net.ipv4.tcp_fin_timeout=60 sudo sysctl -w net.ipv4.tcp_max_syn_backlog=8192 sudo sysctl -w net.core.somaxconn=4096
持久化设置:将上述命令添加到/etc/sysctl.conf
文件中,执行sudo sysctl -p
生效。通过工具监控内存使用情况,针对性调整配置。
jconsole
(JDK自带)或VisualVM
,监控Tomcat的堆内存、GC频率、线程数等指标,识别内存瓶颈。-XX:+HeapDumpOnOutOfMemoryError
参数生成堆转储文件,使用Eclipse MAT
分析内存泄漏对象。catalina.out
日志,查找OutOfMemoryError
或GC overhead limit exceeded
等错误,调整JVM参数。sudo systemctl restart tomcat
(若使用systemd
)或./startup.sh
(若使用脚本)。maxThreads
,内存密集型应用可增大-Xmx
。