Java 应用程序生产环境下问题排查

在 Java 应用程序的生产环境中,出现问题(如性能下降、内存泄漏、线程死锁、服务不可用等)时,排查问题需要系统化的方法和工具支持。以下是常见的 问题排查手段,按问题类型分类:

🧭 一、基础排查思路

  1. 日志分析(首选手段)
    • 查看应用日志(如 log4j, logback
    • 重点关注 ERRORWARN、异常堆栈
    • 使用日志聚合工具如 ELK(Elasticsearch + Logstash + Kibana)、Graylog、Splunk 等
  2. 监控系统
    • APM 工具(如:Prometheus + Grafana、Skywalking、Pinpoint、New Relic、Datadog)
    • 监控内容包括:
      • JVM 状态(内存、GC、线程数)
      • 请求量、延迟、错误率
      • 数据库连接、慢 SQL
  3. 复现场景
    • 明确“出问题”的前因后果
    • 收集用户操作、调用链信息、系统日志、监控数据

🧠 二、常见问题排查手段

1. CPU 占用高

排查工具:

  • top / htop(Linux)
  • jstack(抓取线程快照)
  • jvisualvm / Java Mission Control(可视化分析)
  • perf(高级 Linux 工具)

操作步骤:

1
top -Hp <pid>  # 查看哪个线程占用CPU高

将线程ID转为16进制,结合 jstack 找出对应的 Java 线程:

1
2
jstack <pid> > dump.txt
# 查找对应的 nid=0xNNNN 线程堆栈

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看进程
ps -ef | grep java

# 查看堆信息
jmap -heap <pid>

# 导出堆快照
jmap -dump:format=b,file=heap.hprof <pid>

# 查看线程快照
jstack <pid> > thread.txt

# GC 情况
jstat -gc <pid> 1s

# 远程连接 JMX
java -Dcom.sun.management.jmxremote ...

🧰 四、生产环境排查建议

建议项 描述
关闭调试模式 不应开启 -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-应用程序生产环境下问题排查/
作者
Liu Yuhe
发布于
2025年8月7日
许可协议