好的阿杰,我帮你整理一份 Tomcat 服务频繁崩溃的排查方法,从日志分析、配置检查、系统资源到代码问题,全方位覆盖。
1️⃣ 查看 Tomcat 日志
Tomcat 崩溃最直接的线索来自日志文件,默认目录通常为 $CATALINA_HOME/logs/
- 主要日志文件:
日志 | 说明 |
---|---|
catalina.out | 主日志,记录启动、异常、系统输出 |
localhost.<date>.log | 应用相关日志 |
manager.<date>.log | Manager 管理相关日志 |
host-manager.<date>.log | Host Manager 日志 |
catalina.<date>.log | Tomcat 系统启动/异常日志 |
- 查看最近异常
tail -n 100 catalina.out
tail -n 100 localhost.*.log
- 搜索关键词:
grep -i "Exception" catalina.out
grep -i "OutOfMemoryError" catalina.out
grep -i "SEVERE" catalina.out
2️⃣ 排查常见崩溃原因
2.1 内存不足(OutOfMemoryError)
- JVM 堆内存不足:
ps -ef | grep java
# 查看 -Xmx -Xms 参数
- 解决:
- 调整 Tomcat JVM 参数:
CATALINA_OPTS="-Xms512m -Xmx2g -XX:PermSize=256m -XX:MaxPermSize=512m"
- 优化应用内存使用,避免内存泄漏
2.2 端口被占用
- Tomcat 启动失败或崩溃:
netstat -tlnp | grep 8080
- 解决:
- 确认端口是否被其他进程占用
- 修改
server.xml
中 Connector 端口
2.3 配置错误
server.xml
、web.xml
或应用配置错误可能导致 Tomcat 崩溃- 检查:
xmllint --noout $CATALINA_HOME/conf/server.xml
- 确保 XML 配置无语法错误
2.4 日志文件过大或磁盘空间不足
- 磁盘满或日志过大可能导致 Tomcat 崩溃
df -h
ls -lh $CATALINA_HOME/logs/
- 解决:
- 清理或压缩旧日志
- 配置 logrotate 或 Tomcat 内置日志轮转
2.5 Web 应用问题
- 应用部署包错误或内存泄漏导致服务频繁崩溃
- 排查:
- 暂停所有 Web 应用,只启动 Tomcat
- 单独部署应用逐个测试
- 使用
jmap
、jstack
分析线程堆栈或内存占用
3️⃣ 使用 JVM 工具辅助排查
工具 | 功能 |
---|---|
jstack <PID> | 打印线程堆栈,分析死锁或线程阻塞 |
jmap -heap <PID> | 查看堆内存使用情况 |
jmap -dump:format=b,file=dump.hprof <PID> | 导出内存堆文件,用 VisualVM 分析内存泄漏 |
jconsole / VisualVM | 实时监控 Tomcat 内存、线程、CPU 使用 |
4️⃣ 系统层面排查
- CPU / 内存使用
top
htop
free -m
- 排查是否因系统资源不足导致崩溃
- 文件句柄限制
ulimit -n
- Tomcat 打开文件过多导致服务崩溃,可增加:
ulimit -n 65535
- 磁盘 IO
iostat -x 1
- 高 IO 可能导致 Tomcat 响应慢甚至崩溃
5️⃣ 建议操作步骤
- 查看
catalina.out
和应用日志 → 确定崩溃类型 - 检查 JVM 参数 → 调整内存、线程、PermSize
- 检查端口、配置、日志空间
- 分析 Web 应用 → 暂停或单独部署排查问题
- 使用 JVM 工具分析内存、线程或死锁问题
- 系统资源监控 → CPU、内存、磁盘、文件句柄
好的,阿杰 👍
下面我给你整理一份 Tomcat 服务频繁崩溃的排查方法,通俗易懂,涵盖常见场景和解决思路:
🔎 Tomcat 服务频繁崩溃的排查方法
Tomcat 是 Java Web 容器,运行中频繁崩溃(宕机、进程退出、无响应)一般由 资源瓶颈、配置错误、应用代码问题或系统环境异常 导致。排查思路如下:
1️⃣ 查看 Tomcat 日志
- catalina.out(主运行日志)
- localhost.log、manager.log(应用相关)
- hs_err_pid.log*(JVM 崩溃产生的日志)
重点关注:
OutOfMemoryError
StackOverflowError
Too many open files
- 线程池、数据库连接池报错
👉 日志是第一手线索。
2️⃣ 检查 JVM 内存设置
Tomcat 崩溃常见于 内存不足:
JAVA_OPTS="-Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m"
-Xms
:初始堆内存-Xmx
:最大堆内存
⚠ 如果日志有java.lang.OutOfMemoryError
,需要调大内存或优化代码(减少内存泄漏)。
3️⃣ 查看系统资源
Linux 下排查命令:
top -c # 查看CPU、内存占用
free -m # 查看剩余内存
df -h # 查看磁盘使用
ulimit -a # 查看文件句柄限制
- CPU 100% → 可能是死循环或高并发
- 内存不足 → JVM GC 压力大
- 磁盘满 → 日志无法写入,Tomcat 崩溃
- 句柄数不足 → 报错 “Too many open files”
4️⃣ 检查线程与连接池
高并发下,如果线程数设置过低/过高,也会导致崩溃:
- 编辑
server.xml
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="500"
minSpareThreads="50"
maxConnections="1000"
acceptCount="200"
connectionTimeout="20000"
redirectPort="8443" />
maxThreads
:最大线程数acceptCount
:队列长度(请求排队)- 如果过低 → 服务被打满;过高 → 内存压力大
5️⃣ 检查应用代码
- 是否有 内存泄漏(未关闭连接、线程未释放)
- 是否有 死循环 或 递归调用
- 是否存在 大文件上传/下载 导致资源耗尽
👉 可以用 VisualVM、MAT 工具分析内存 Dump。
6️⃣ JVM 崩溃排查
如果生成 hs_err_pid*.log
,说明 JVM 层面崩溃,可能原因:
- 使用了不稳定的 JDK 版本
- JNI 本地库导致内存错误
- 系统资源冲突
解决方案:
- 升级 JDK 到稳定版本
- 检查第三方库
7️⃣ 监控与预防
- 日志切割:避免日志文件过大
- 定时重启:crontab 定期重启(缓解内存泄漏)
- 接入监控:如 Zabbix、Prometheus,实时监控 CPU/内存/线程
- Nginx 反向代理 + Tomcat 集群,防止单点挂掉
✅ 总结
Tomcat 频繁崩溃的排查顺序:
- 看日志找报错信息
- 查 JVM 内存设置是否合理
- 查系统资源是否耗尽
- 查线程池、连接池配置
- 检查应用代码内存泄漏
- 如果 JVM 崩溃 → 看 hs_err_pid 日志
👉 实战中,最常见的还是 内存泄漏 + 资源不足。
发表回复