一、线上排查的核心挑战与工具价值
在 Java 应用的生产环境中,性能下降、内存泄漏、线程死锁、网络延迟等问题往往具有隐蔽性和复杂性,如何在最短时间内定位并解决问题,是衡量开发者技术能力的重要标准。本文系统整理 50 + 线上问题排查常用命令,覆盖系统资源监控、JVM 深度分析、网络诊断、日志处理、容器管理等核心场景,并结合实战案例提供完整排查路径,帮助开发者构建高效的问题定位体系。
二、系统资源监控:快速定位基础设施瓶颈
系统资源异常是线上问题的常见诱因,通过以下命令可实时掌握 CPU、内存、IO 等关键指标,快速识别资源瓶颈。
1. top:进程级资源实时监控
bash
top -o %CPU # 按CPU使用率排序
top -u java_user # 过滤特定用户进程
top -p $(pgrep java) # 监控Java进程
核心价值:通过 % CPU(CPU 使用率)、% MEM(内存占用)、TIME+(累计运行时间)定位异常进程。若 % CPU 持续高于 80%,需进一步分析是系统进程还是 Java 进程导致。
2. htop:交互式增强监控
bash
htop
优势场景:多核系统中直观展示每个 CPU 核心负载,支持鼠标操作查看进程树,快速识别线程级资源竞争。
3. vmstat:系统级资源统计
bash
vmstat 2 10 # 每2秒采样,共10次
关键指标:
- r(运行队列长度):值持续大于 CPU 核心数,表明 CPU 瓶颈
- si/so(内存交换频率):数值高提示内存不足
- us/sy(用户态 / 内核态 CPU 占比):us 高则应用层负载重,sy 高可能系统调用频繁
4. iostat:磁盘 IO 性能分析
bash
iostat -xd 2 5 # 显示设备详细IO统计,每2秒一次
判断标准:
- %util(设备利用率)>70% 表明 IO 繁忙
- await(单次 IO 等待时间)>50ms 提示响应缓慢
- r/s/w/s(读写速率)结合业务峰值评估是否超限
三、JVM 深度分析:从进程到字节码的诊断链
JVM 相关问题(如 GC 频繁、内存泄漏、线程死锁)是 Java 应用的特有挑战,需借助 JDK 自带工具链逐层剖析。
1. jps:Java 进程定位起点
bash
jps -lvm # 显示完整包名、JVM参数及PID
必做步骤:排查前先用此命令确认目标进程 PID,避免操作错误进程。
2. jstat:JVM 运行时统计
bash
jstat -gc [PID] 1000 # 每秒监控GC情况
jstat -class [PID] # 类加载统计
核心监控项:
- S0C/S1C/Eden/Old:各代内存空间变化
- YGC/FGC:年轻代 / Full GC 次数及耗时
- OC利用率:老年代空间增长趋势
3. jmap:内存映射与 dump 分析
bash
jmap -heap [PID] # 查看堆内存布局
jmap -histo [PID] | head -20 # 前20大对象统计
jmap -dump:file=heap.hprof [PID] # 生成堆转储文件
应用场景:
- 内存泄漏排查:对比不同时间点的 dump 文件,观察对象增长趋势
- 大对象定位:通过-histo命令识别占用超过 10% 堆空间的对象类型
4. jstack:线程堆栈分析利器
bash
jstack -l [PID] > thread.log # 生成含锁信息的堆栈
jstack -F [PID] | grep "deadlock" # 检测死锁
分析要点:
- BLOCKED状态线程:定位锁竞争源头
- WAITING/TIMED_WAITING:检查线程池或阻塞队列是否异常
- 死锁排查:通过Found 1 deadlock日志快速定位循环等待链
5. jcmd:一站式 JVM 诊断工具
bash
jcmd [PID] GC.run # 强制触发GC
jcmd [PID] VM.flags # 查看JVM参数
jcmd [PID] GC.heap_dump filename=heap.jfr # 生成JFR格式转储
优势:替代jstat/jmap/jstack等单一工具,支持动态执行诊断命令
四、网络诊断:从连通性到协议层的全链路排查
网络问题常表现为请求超时、连接重置等,需结合多层工具定位。
1. netstat/ss:网络连接状态分析
bash
netstat -tnlp # 查看监听端口
ss -ta | grep ESTABLISHED # 统计ESTABLISHED连接数
关键判断:
- TIME_WAIT状态过多:可能存在端口耗尽,需调整 TCP 参数
- 端口未监听:检查应用启动状态或防火墙配置
2. tcpdump:数据包级抓包分析
bash
tcpdump -i any port 8080 -w capture.pcap # 抓取8080端口数据包
使用场景:
- 协议解析:通过 Wireshark 分析请求 / 响应内容
- 网络延迟定位:对比数据包发送与接收时间戳
3. curl:HTTP 服务健康检测
bash
curl -I http://api.example.com # 检测HTTP响应头
curl --connect-timeout 5 -m 10 http://api.example.com # 设置超时控制
检测点:
- 响应码非 2xx:排查应用逻辑或网关问题
- 响应时间超过 SLA:结合后端日志分析耗时环节
五、日志与文件处理:问题定位的关键线索
日志是排查应用异常的核心依据,合理使用文本处理命令可快速提取关键信息。
1. tail/grep:实时日志监控与过滤
bash
tail -f app.log | grep "ERROR" # 实时追踪错误日志
grep -A 5 -B 5 "OOMError" app.log # 显示异常前后5行上下文
进阶技巧:
- grep -r "关键词" /var/log:递归搜索多文件
- grep --color=auto:高亮显示匹配项提升可读性
2. awk/sed:日志结构化分析
bash
awk '{print $4}' access.log # 提取第四列数据
sed 's/INFO/DEBUG/g' app.log # 批量替换日志级别
典型应用:
- 统计 HTTP 响应码分布:awk '{print $9}' access.log | uniq -c
- 计算平均响应时间:awk '{sum+=$10} END {print sum/NR}' access.log
3. find/du:磁盘空间管理
bash
find / -type f -size +100M # 查找大于100M的文件
du -sh /var/log # 统计目录大小
排查流程:
- df -h发现磁盘不足 → 2. du定位大目录 → 3. find清理过期日志或临时文件
六、进程与性能优化:从资源到代码的优化路径
1. ps/pstree:进程树与资源排序
bash
ps aux --sort=-%cpu | head -10 # 按CPU使用率排序前10进程
pstree -p [PID] # 查看进程父子关系
用途:识别僵尸进程、守护进程异常启动等场景。
2. perf/strace:系统级性能剖析
bash
perf record -F 99 -p [PID] -g # 采样CPU热点
strace -p [PID] -e open # 跟踪进程的文件打开操作
深度分析:
- perf report定位代码级热点函数
- strace排查系统调用耗时(如read/write阻塞)
七、容器与微服务场景:云原生环境的专属工具
在 Kubernetes/Docker 环境中,需结合容器化工具链排查:
1. docker 系列命令
bash
docker logs -f [container_id] # 实时查看容器日志
docker stats [container_id] # 监控容器资源使用
2. kubectl:K8s 集群诊断
bash
kubectl get pods -o wide # 查看Pod状态及节点分布
kubectl exec -it [pod_name] /bin/sh # 进入容器排查
典型场景:
- Pod 反复重启:通过kubectl describe pod查看事件日志
- 服务间通信失败:检查 Pod 网络策略与端口映射
八、专用诊断工具:提升排查效率的利器
1. Arthas:阿里开源诊断神器
bash
java -jar arthas-boot.jar # 启动后选择目标进程
dashboard # 实时系统概况
trace com.example.Service method # 追踪方法执行耗时
核心功能:动态监控方法调用链、查看 JVM 参数、热更新代码等。
2. JFR(Java Flight Recorder)
bash
jcmd [PID] JFR.start duration=30s filename=recording.jfr # 录制JVM运行数据
优势:低开销收集 CPU、内存、锁竞争等详细信息,配合 JMC(Java Mission Control)进行可视化分析。
九、实战排查思路:问题类型与工具链组合
1. CPU 使用率高
排查路径:
bash
top → 定位高CPU进程PID → jstack PID生成堆栈 → perf record -p PID分析热点函数
关键步骤:
- 通过ps -mp PID -o THREAD,tid找到高 CPU 线程
- 将线程 ID 转为 16 进制,在堆栈中搜索对应的nid定位代码行
2. 内存泄漏
排查路径:
bash
free确认内存压力 → jmap -heap PID查看堆使用 → 定时生成dump文件 → jhat/MAT对比分析
经验技巧:关注老年代空间持续增长、大对象引用链(如集合类未释放)。
3. 响应缓慢
多维排查:
- 系统层:vmstat查看负载队列,netstat检查连接数
- 应用层:jstack分析线程状态,Arthastrace追踪慢方法
- 网络层:tcpdump抓取请求包,分析网络延迟占比
十、总结:构建系统化的排查能力
线上问题排查是技术与经验结合的过程,核心要点包括:
- 分层诊断:从基础设施(CPU / 内存 / IO)→ JVM(GC / 内存 / 线程)→ 应用逻辑(日志 / 业务数据)逐步深入
- 工具组合:单一命令仅提供片面信息,需按「监控→定位→分析→验证」流程组合使用
- 预防体系:建立 APM 监控(如 Prometheus+Grafana)、完善日志链路追踪(如 ELK),实现问题预警
- 持续实践:在非生产环境模拟故障(如 Chaos Engineering),熟练掌握工具链使用
掌握这 50 + 命令并形成结构化排查思维,可将线上问题平均修复时间(MTTR)缩短 50% 以上。记住,优秀的开发者不仅能解决问题,更能通过工具与流程优化预防问题的发生。
附录:常用命令速查表
类别 | 关键命令 | 核心用途 |
系统监控 | top, htop, vmstat, iostat | 资源瓶颈定位 |
JVM 分析 | jps, jstat, jmap, jstack | 进程状态、GC、内存、线程诊断 |
网络诊断 | netstat, ss, tcpdump, curl | 连接状态、数据包分析、服务健康检测 |
日志处理 | tail, grep, awk, sed | 日志过滤、结构化分析 |
容器管理 | docker, kubectl | 容器状态、K8s 集群排查 |
性能优化 | perf, strace, Arthas, JFR | 系统调用追踪、方法耗时分析 |
通过反复实践与场景化训练,这些工具将成为开发者线上排查的「瑞士军刀」,助力快速构建稳定可靠的 Java 应用系统。
感谢关注【AI 码力】!愿代码无 Bug,生产稳如磐石,系统永无虞!