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)分析.hprof
VisualVM
查看实时堆使用- 日志中查找
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-应用程序生产环境下问题排查/