JVM内存配置是Tomcat性能的基础,不合理的内存设置会导致频繁GC、内存溢出等问题。
关键参数配置:
-Xms(初始堆大小)和-Xmx(最大堆大小)指定,建议两者设为相同值(如-Xms4G -Xmx4G),避免堆内存动态调整带来的性能波动。堆内存大小一般为物理内存的70%-80%(如16G内存设为12G)。-XX:MetaspaceSize(初始元空间大小,如256m)和-XX:MaxMetaspaceSize(最大元空间大小,如512m)配置,防止类元数据溢出。-XX:+UseG1GC),适合大内存、低延迟场景,可通过-XX:MaxGCPauseMillis(最大GC停顿时间,如200ms)控制停顿时间;吞吐量优先场景可选择ParallelGC(-XX:+UseParallelGC)。/usr/share/tomcat/bin/catalina.sh文件开头添加JAVA_OPTS参数,例如:export JAVA_OPTS="-server -Xms4G -Xmx4G -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC"
线程池是Tomcat处理请求的核心,合理的线程配置能平衡并发量和资源消耗。
关键参数配置(在server.xml的<Connector>标签中设置):
maxThreads的10%-20%(如maxThreads=64时,设为6-12)。maxThreads的1.5-2倍(如maxThreads=64时,设为96-128),队列过长会导致请求被拒绝。<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="200"
minSpareThreads="40"
acceptCount="300"
maxConnections="10000" />
选择高效的连接器协议能显著提升Tomcat的网络I/O性能。
推荐配置:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" ... />
<Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" ... />
启用Gzip压缩:压缩HTTP响应数据,减少网络传输量,提升页面加载速度。配置示例:
<Connector port="8080" ... compression="on" compressionMinSize="8192" compressableMimeType="text/html,text/xml,text/plain,application/json" />
compression="on":开启压缩功能。compressionMinSize="8192":只有响应数据大于8KB时才压缩,避免小数据压缩反而增加CPU开销。compressableMimeType:指定需要压缩的MIME类型(如HTML、XML、JSON)。静态资源缓存:对静态资源(如图片、CSS、JS)设置缓存,减少重复请求。在web.xml中配置:
<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
<init-param>
<param-name>ExpiresByType image</param-name>
<param-value>access plus 1 month</param-value>
</init-param>
<init-param>
<param-name>ExpiresByType text/css</param-name>
<param-value>access plus 1 week</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
调整内核参数:修改/etc/sysctl.conf文件,优化网络性能:
net.core.somaxconn = 65535 # 最大连接数
net.ipv4.tcp_tw_reuse = 1 # 允许TCP连接复用
net.ipv4.tcp_tw_recycle = 1 # 快速回收TIME_WAIT连接
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列长度
net.core.netdev_max_backlog = 65535 # 网络设备接收队列长度
fs.file-max = 65536 # 最大文件描述符数
执行sysctl -p使配置生效。
调整文件描述符限制:修改/etc/security/limits.conf文件,增加Tomcat用户的文件描述符限制:
* soft nofile 65536
* hard nofile 65536
禁用透明大页(THP):THP会导致内存碎片,降低性能。执行以下命令禁用:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
添加到/etc/rc.local文件中,开机自启。
server.xml的<Connector>标签中设置enableLookups="false",避免Tomcat对客户端IP进行DNS反向解析,减少延迟。web.xml中配置会话超时时间(如180分钟),避免长期占用会话资源:<session-config>
<session-timeout>180</session-timeout>
</session-config>
/manager、/host-manager),减少资源消耗。server.xml的<Connector>标签中设置server=" ",避免暴露Tomcat版本,减少安全风险。优化后需通过监控工具验证效果,持续调整参数:
jconsole、jvisualvm或Arthas监控堆内存使用、GC频率,调整堆大小和GC算法。Tomcat Manager或Prometheus+Grafana监控线程池使用率、请求响应时间、吞吐量,调整maxThreads、acceptCount等参数。Apache JMeter模拟高并发场景,测试优化效果,找出性能瓶颈。