Java 应用程序生产环境下问题排查
在 Java 应用程序的生产环境中,出现问题(如性能下降、内存泄漏、线程死锁、服务不可用等)时,排查问题需要系统化的方法和工具支持。以下是常见的 问题排查手段,按问题类型分类:
🧭 一、基础排查思路
- 日志分析(首选手段)
- 查看应用日志(如
log4j,logback) - 重点关注
ERROR、WARN、异常堆栈 - 使用日志聚合工具如 ELK(Elasticsearch + Logstash + Kibana)、Graylog、Splunk 等
- 查看应用日志(如
- 监控系统
- APM 工具(如:Prometheus + Grafana、Skywalking、Pinpoint、New Relic、Datadog)
- 监控内容包括:
- JVM 状态(内存、GC、线程数)
- 请求量、延迟、错误率
- 数据库连接、慢 SQL
- 复现场景
- 明确“出问题”的前因后果
- 收集用户操作、调用链信息、系统日志、监控数据
🧠 二、常见问题排查手段
1. CPU 占用高
排查工具:
top/htop(Linux)jstack(抓取线程快照)jvisualvm/Java Mission Control(可视化分析)perf(高级 Linux 工具)
操作步骤:
1 | |
将线程ID转为16进制,结合 jstack 找出对应的 Java 线程:
1 | |
2. 内存泄漏 / OOM
排查工具:
jmap -dump导出堆内存快照jhat/MAT(Memory Analyzer Tool)分析.hprofVisualVM查看实时堆使用- 日志中查找
java.lang.OutOfMemoryError
分析重点:
- 某类对象数量是否异常
- GC频率和Full GC情况
- 是否存在缓存、线程池、连接池未释放
3. 线程死锁
排查工具:
jstack多次抓取线程快照jconsole/visualvm的线程视图- 查找
Found one Java-level deadlock:
4. 数据库慢/阻塞
排查工具:
- 查看连接池状态(如 Druid、HikariCP)
- 打开数据库慢查询日志
- 使用 APM 追踪 SQL 调用时间
5. 网络/服务不可用
排查手段:
curl/telnet/ping/nc检查端口联通- 检查负载均衡器、Nginx、网关配置
- 查看服务注册中心(如 Nacos、Eureka)是否注册成功
- 检查防火墙和安全组配置
6. 服务频繁重启 / Crash
排查方向:
- 日志是否有异常(OutOfMemoryError、StackOverflow、Signal 11)
- 是否被 OOM Killer 杀掉(查看
dmesg) - 容器 / Supervisor / K8s 的 probe 配置是否异常
7. GC 频繁 / 性能差
工具:
jstat -gcutil <pid> 1s实时查看 GC 情况GC 日志分析(开启-Xlog:gc*或-verbose:gc)
🔧 三、常用命令速查
1 | |
🧰 四、生产环境排查建议
| 建议项 | 描述 |
|---|---|
| 关闭调试模式 | 不应开启 -agentlib:jdwp 等调试端口 |
| 开启日志分级 | 区分 debug、info、warn、error |
| 设定合适的 JVM 参数 | -Xms, -Xmx, -XX:+HeapDumpOnOutOfMemoryError |
| 设置健康检查 | 容器、K8s、LB 健康探针及时剔除异常节点 |
| 灰度发布与回滚策略 | 确保变更可控 |
| 链路追踪系统 | 便于定位调用链问题(如 SkyWalking、Zipkin、Jaeger) |
Java 应用程序生产环境下问题排查
https://liuyuhe666.github.io/2025/08/07/Java-应用程序生产环境下问题排查/