Tomcat生产环境调优

目录

一.开启tomcat内存监控

1.1 tomcat:8080展示界面

1‌.1.1 Server Status(服务器状态)‌

1‌.1.2 Manager App(应用管理)‌

1‌.1.3 Host Manager(虚拟主机管理)‌

1.1.4 补充说明

1.2 server status:

1.2.1 JVM内存区域与监控数据对照表

1.2.2 关键配置参数对照

二.JVM内存配置优化(针对liunx)

2.1 基础堆内存配置(注3:配置详解)

2.2 元空间配置

2.3 代码缓存配置

2.4 生产环境建议

三.垃圾回收优化 

3.1 基础配置介绍 

‌3.2 推荐配置(40核CPU场景)

‌3.2.1 通用服务器‌

3.2.2 高吞吐应用‌

3.2.3 容器环境‌

‌3.3 调优建议‌

四.JVM参数及异常优化

4.1 基础配置

4.1.1 ‌-XX:+DisableExplicitGC‌

4.2.2 ‌-XX:+HeapDumpOnOutOfMemoryError‌

4.2.3 ‌-XX=/home/tomcat_error_log/‌

4.2.4 综合建议

五.连接器(Connector)调优

5.1 基础配置介绍

5.1.1 基础网络配置‌

5.2.2 性能增强参数‌

5.2 高级配置介绍

5.2.1 缓存池容量调整

六.线程池配置

6.1 参数作用说明

6.1.1 工人团队配置

6.1.2 团队规模控制‌

6.1.3 工作效率管理‌

6.2 生产环境推荐值

6.3 注意事项

七、会话管理优化

7.1 会话超时

7.2 高可用场景增强配置

7.3 监控指标建议

7.4 典型问题解决方案

八. 静态资源优化

8.1 启用Sendfile

8.1.1 sendfile参数解析‌

8‌.1.2 类比场景‌

8.1.3 注意事项‌

8.2 静态资源处理优化

8.2.1 当前配置的通俗解释

8.2.2 生产环境推荐配置

九. 异常

十. 结语

十一. 参考文献

注解

注1:什么是tomcat manager-gui?配置文件参数的具体含义?

一.tomcat manager-gui介绍

1. manager-gui角色核心功能

2. 其他关键角色对比

3. 用户配置分析

4. 安全实践建议

二.配置文件参数以及含义

‌1.角色定义(Role Definitions)‌

2.用户配置(User Assignment)

3.安全建议‌

4.生产环境禁用‌:

注2:Code Cache 主要是什么功能是什么?

1‌.加速代码执行‌

2.支持分层编译优化‌

3‌.存放JNI本地代码‌

4‌.内存隔离管理‌

注3:内存配置参数详解

-Xms -Xmx:

1.堆内存的主要工作

2.为什么需要这么大?

-XX:MetaspaceSize -XX:MaxMetaspaceSize

‌1. 参数含义

‌2. 推荐大小

‌3. 生活化比喻‌

‌4. 注意事项‌

-XX:PermSize -XX:MaxPermSize

1‌.永久代的作用‌

2‌.推荐大小‌

‌常规应用‌

‌大型应用‌(如加载大量框架)

3‌.重要提醒‌

-XX:ReservedCodeCacheSize

‌代码缓存的作用‌

‌为什么需要设置这个参数?‌

‌Tomcat 中的使用场景‌

‌注意事项‌

注4:什么是JIT?

‌2. 为什么“一般无需调整”?‌

‌3. 什么情况下需要调整?‌

‌4. JIT 的潜在问题‌

5‌.总结‌

注5:垃圾回收机制参数详解

1.参数详解

2.两者配合的典型场景‌

‌3.如何判断是否需要调整?‌

注6:内存管理和异常排查参数解析

‌1. 参数解析‌

‌2. 推荐配置‌

‌3. 注意事项‌

什么是OOM?

‌1. OOM类型与原因‌

‌2. 如何避免OOM‌

‌1.合理设置堆大小‌

‌2.监控与调优‌

‌3.代码优化‌

‌3. 生产环境建议‌

注7:BIO和NIO的区别?

注8:高级NIO配置详解

1.核心参数解析‌

注9:tomcat线程池大小推荐

1. 核心参数配置基准

2. 关键优化建议

3. 不同业务场景配置模板

3.1 电商秒杀系统

3.2 企业内部OA系统‌

4. 必须监控的指标

5. 典型问题解决方案


(注解内容为详细科普具体配置的含义)

一.开启tomcat内存监控

调试下(临时开启)tomcat manager-gui (注1)

<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin-script"/>
<role rolename="admin-gui"/>
<role rolename="manager-jmx"/>
<role rolename="manager-script"/>
<role rolename="manager-status"/>
<user username="tests" password="123456" roles="manager,manager-gui,admin-script,admin-gui,manager-jmx,manager-script,manager-status"/>

访问:ip:8080/manager (如果无法正常显示的情况下)

需要注释/usr/local/tomcat/webapps/manager/META-INF/context.xml中指定配置。

  <!--
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
  --> 

   因为默认只能本机访问,注释掉以后别的机器也可以访问了。

   修改完成后登录ip:8080访问tomcat页面:

1.1 tomcat:8080展示界面

1‌.1.1 Server Status(服务器状态)

  • 相当于汽车的"仪表盘"。
  • 可以实时查看:内存使用量(像手机剩余内存)、当前访问人数(像店铺客流量)、服务器运行时间(像汽车里程表)。
  • 主要用于检查服务器是否"健康"。

1‌.1.2 Manager App(应用管理)

  • 相当于手机的"应用商店+任务管理器"。
  • 功能包括:安装/卸载网站程序(像装APP)、启动/停止已部署的网站(像关闭后台程序)、查看所有运行中的网站。
  • 日常用得最多的管理功能。

1‌.1.3 Host Manager(虚拟主机管理)

  • 相当于房产中介的"钥匙串"。
  • 管理多个网站域名(像管理不同房子的钥匙)。
  • 可以:添加/删除域名绑定、设置默认网站、配置域名重定向。
  • 一般只有服务器管理员需要操作。

1.1.4 补充说明

  • 这三个按钮需要管理员账号密码才能操作。
  • 普通用户访问网站时看不到这些按钮。
  • 如果误操作可能导致网站下线,建议操作前备份数据。

针对调优目前我们主要使用server status查看内存使用及性能:

1.2 server status:

1.2.1 JVM内存区域与监控数据对照表

监控项名称

内存类型

相当于

功能说明

您的数据状态分析

PS Eden Space

堆内存(新生代)

"工作台"

新创建对象的存放区,频繁进行垃圾回收

使用率仅7%,内存非常充裕

PS Old Gen

堆内存(老年代)

"仓库"

存放长期存活对象,GC频率较低

1%使用率,几乎无压力

PS Survivor Space

堆内存(幸存区)

"中转站"

存放经过Minor GC后存活的对象

0%使用,说明近期未发生新生代GC

Code Cache(注2)

非堆内存

"代码保险箱"

存储JIT编译后的本地代码

接近上限(99%),建议监控

Metaspace

非堆内存

"说明书档案库"

存放类元数据(Java 8+取代PermGen)

使用率98%,需关注类加载情况

Compressed Class

非堆内存

"压缩版说明书"

压缩存储的类指针信息

使用率极低,正常

1.2.2 关键配置参数对照

监控中的"初始化/总共/最大值"对应JVM启动参数:

  • -Xms初始堆大小 = Eden + Old + Survivor (1024+2731+170=3925MiB) 前三行分配4096的内存。

  • -Xmx最大堆大小 = 1067+2731+170=3968MiB

  • -XX:MetaspaceSize=58.25MiB

  • -XX:MaxMetaspaceSize=无限制(显示-0.00 MiB)

二.JVM内存配置优化(针对liunx)

在/apache-tomcat-9.0.107/bin下编辑catalina.sh并添加

(服务器64g内存情况下单个tomcat建议内存为4g)

JAVA_OPTS="-server -Xms4096m -Xmx4096m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:ReservedCodeCacheSize=256m"

2.1 基础堆内存配置(注3:配置详解)

        2‌.1.1 -server
        启用服务器模式,针对多核CPU优化,提升长期运行性能13。

        2.1.2 -Xms4096m
        初始堆内存为4GB,JVM启动时立即分配的物理内存量14。

        2‌.1.3 -Xmx4096m
        最大堆内存为4GB,建议与-Xms相同以避免运行时动态调整带来的性能波动15。

2.2 元空间配置

        2‌.2.1 -XX=256m
        元空间初始容量256MB,存放类元数据信息(JDK8+替代PermGen)68。

         2‌.2.2 -XX=512m
        元空间上限512MB,防止类加载器泄漏导致内存无限增长68。

2.3 代码缓存配置

        2‌.3.1 -XX=256m
        JIT编译后本地代码的缓存区大小,影响热点代码执行效率9。

2.4 生产环境建议

  • 堆内存配置需根据物理内存调整,通常Xms/Xmx设为物理内存50%-70%45
  • 元空间推荐初始值256m,最大512m-1g(动态加载类多的应用需增大)

三.垃圾回收优化 

JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=16 -XX:ConcGCThreads=4"

3.1 基础配置介绍 

注5配置信息详细解析

  • -XX:+UseG1GC
    启用G1垃圾回收器,适合多核大内存服务器,能减少GC停顿时间。

  • -XX:MaxGCPauseMillis=200
    设定GC最大停顿时间为200毫秒,G1会尽量满足(非绝对保证),值越小回收越频繁。

  • -XX:ParallelGCThreads=4
    并行GC线程数,默认按CPU核数计算(40核默认约25线程)。设为4表示强制限制为4线程,适合容器或低负载场景。

  • -XX:ConcGCThreads=2
    并发GC线程数(如标记阶段),通常设为并行线程的1/4~1/2,避免抢占业务线程。

    

‌3.2 推荐配置(40核CPU场景)

基本我配置的都会比建议的稍微小一点,这个要根据实际生产环境cpu使用情况自行判断‌

‌3.2.1 通用服务器

​​​​​​​-XX:ParallelGCThreads=16 # 物理核心数的50% 
-XX:ConcGCThreads=4 # 并行线程的1/4 
  • 适用场景‌:混合型应用(Web服务、微服务),平衡GC效率和CPU利用率。

3.2.2 高吞吐应用

-XX:ParallelGCThreads=30 # 物理核心数的75% 
-XX:ConcGCThreads=8
  • 适用场景‌:大数据处理、计算密集型任务,优先减少GC时间。

3.2.3 容器环境

-XX:ParallelGCThreads=4 # 匹配容器vCPU配额 
-XX:ActiveProcessorCount=4 # 显式声明可用CPU
  • 关键点‌:避免JVM误读宿主机核心数。

3.3 调优建议

  • 监控验证‌:通过jstat -gc <pid>观察实际停顿时间,若MaxGCPauseMillis频繁超时,可适当增加并行线程数。
  • 避免冲突‌:ParallelGCThreads不宜超过物理核心数,否则会引发线程竞争。
  • 关联参数‌:搭配-Xmx设置堆内存(建议4G~32G),过小会导致频繁GC,过大会延长单次停顿

四.JVM参数及异常优化

JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/tomcat_error_log/"

4.1 基础配置

注6:配置信息详细介绍

4.1.1 ‌-XX:+DisableExplicitGC

禁用显式调用System.gc(),防止代码中手动触发的垃圾回收干扰JVM自动回收机制。该参数可避免因显式GC导致的性能波动,但需确保应用不存在依赖手动GC的逻辑。

4.2.2 ‌-XX:+HeapDumpOnOutOfMemoryError

当发生OutOfMemoryError时自动生成堆转储文件(Heap Dump),用于后续分析内存泄漏或对象占用情况。该参数是诊断OOM问题的关键工具。

4.2.3 ‌-XX=/home/tomcat_error_log/

指定堆转储文件的保存路径(示例中为/home/tomcat_error_log/)。若未设置路径,默认生成在应用工作目录下,文件名格式为java_pid<pid>_<date>_<time>_heapDump.hprof


4.2.4 综合建议

  • 生产环境配置‌:建议同时启用-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath,确保OOM时能快速定位问题。
  • 注意事项‌:-XX:+DisableExplicitGC需结合应用场景评估,若依赖第三方库可能调用System.gc()(如NIO框架),需谨慎启用。

五.连接器(Connector)调优

修改/apache-tomcat-9.0.107/conf/server.xml中的Connector配置

<Connector 
  port="8080" 
  protocol="org.apache.coyote.http11.Http11NioProtocol"
  redirectPort="8443"
  maxThreads="3000" 
  minSpareThreads="600"
  acceptCount="2100"
  enableLookups="false"
  compression="on"
  compressionMinSize="2048"
  #compressableMimeType="text/html,text/css,application/javascript,image/svg+xml"
  compressibleMimeType="text/html,text/css,application/javascript,image/svg+xml"
  URIEncoding="UTF-8"
  connectionTimeout="30000"
  高级配置
  socket.bufferPool="4500"
  socket.processorCache="3000"
  socket.keyCache="3000"
  socket.eventCache="3000"
  socket.appReadBufSize="32768"
  socket.appWriteBufSize="32768"
/>

5.1 基础配置介绍

5.1.1 基础网络配置‌

port="8080":服务监听端口,开发环境常用8080,生产环境建议改为80(HTTP)或443(HTTPS)

protocol="Http11NioProtocol":使用NIO非阻塞模型,适合高并发场景,性能优于传统BIO模式
redirectPort="8443":HTTP请求强制跳转HTTPS时的备用端口,生产环境建议改为443
‌线程池优化‌。(注7:介绍nio和bio区别

maxThreads="500":最大工作线程数,推荐根据服务器核心数调整(公式:CPU核心数 * 200 ~ 500)。

minSpareThreads="50":最小空闲线程数,建议设为maxThreads的10%~20%。
acceptCount="300":等待队列长度,超过后拒绝请求,通常设为maxThreads的50%~70%。

5.2.2 性能增强参数‌

enableLookups="false":禁用DNS反向查询,避免网络延迟。
compression="on":启用GZIP压缩,减少传输数据量。
compressionMinSize="2048":仅压缩大于2KB的文件,平衡CPU消耗。
compressableMimeType:指定需压缩的文件类型,补充image/svg+xml可优化矢量图传输
‌编码与安全‌。(tomcat9.0之前的版本可以用这个参数)

compressibleMimeType(tomcat9.0之后的版本用这个参数约等于compressableMimeType)

URIEncoding="UTF-8":统一URL编码,避免中文乱码。

5.2 高级配置介绍

5.2.1 缓存池容量调整

(注8:参数详细介绍)

参数 原值 建议值 说明
socket.bufferPool 500 4500 设为maxThreads的1.5倍
socket.processorCache 500 3000 与maxThreads一致或设为-1
socket.keyCache 500 3000 匹配并发线程数
socket.eventCache 500 3000 避免事件对象频繁创建

appReadBufSize和appWriteBufSize调整

场景特征 推荐值 调整逻辑
高并发短连接(API服务) 保持8KB 避免内存浪费
大文件传输场景 32-64KB 减少I/O次数提升吞吐量1
混合型业务 16-32KB 平衡内存占用与性能

六.线程池配置

<Executor name="tomcatThreadPool" 
  namePrefix="catalina-exec-"
  maxThreads="800" 
  minSpareThreads="80"
  maxIdleTime="60000"
  maxQueueSize="Integer.MAX_VALUE"
  prestartminSpareThreads="true"
/>

6.1 参数作用说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值