在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。