在生产环境中,当Java应用出现性能下降、响应缓慢、内存泄漏或崩溃等问题时,快速有效的问题排查至关重要。作为Java开发者,掌握一系列命令行工具能帮助你迅速定位问题根源,将损失降到最小。
本文汇总了50个Java开发者在线上环境排查问题时最常用的命令,涵盖系统资源监控、JVM分析、网络检测、日志处理等多个方面。
系统资源监控命令
1. top - 系统进程实时监控
# 基本使用
top
# 按内存排序
top -o %MEM
# 只查看特定用户的进程
top -u java_user
# 监控特定进程
top -p $(pgrep -d',' java)
排查要点:关注CPU使用率(%CPU)、内存使用(%MEM)、运行时间(TIME+),可以快速发现资源占用异常的进程。
2. htop - 增强版系统监控
htop
排查要点:比top提供更友好的界面,支持鼠标操作,可以查看每个CPU核心的使用情况,适合多核系统的监控。
3. vmstat - 系统资源统计
# 每2秒输出一次,共10次
vmstat 2 10
排查要点:关注r(运行队列)、b(阻塞进程)、si/so(交换区使用)、us/sy(用户CPU/系统CPU),可以判断系统是CPU密集型还是IO密集型负载。
4. free - 内存使用情况
# 显示可读格式
free -h
# 每3秒更新一次
free -h -s 3
排查要点:检查可用内存(available)是否过低,swap使用是否过高,判断是否存在内存压力。
5. iostat - IO统计信息
# 查看设备IO统计,每2秒一次,共5次
iostat -xd 2 5
排查要点:关注%util(设备利用率)、r/s和w/s(读写操作数)、await(IO等待时间),判断IO是否成为瓶颈。
JVM监控命令
6. jps - 列出Java进程
# 列出简单进程信息
jps
# 列出完整的包名和进程参数
jps -lvm
排查要点:这是排查Java问题的起点,首先需要确定目标Java进程的PID。
7. jstat - JVM统计信息监控
# 监控GC情况,每1000毫秒一次,共10次
jstat -gc [pid] 1000 10
# 查看类加载情况
jstat -class [pid]
# 查看JIT编译情况
jstat -compiler [pid]
排查要点:关注GC频率、GC耗时、老年代空间使用情况,判断是否存在GC问题。
8. jmap - 内存映射
# 查看堆内存使用概况
jmap -heap [pid]
# 查看对象统计信息
jmap -histo [pid] | head -20
# 生成堆转储文件
jmap -dump:format=b,file=heap_dump.hprof [pid]
排查要点:分析内存中大对象,检查是否存在内存泄漏,必要时生成堆转储文件进行详细分析。
9. jstack - 线程堆栈分析
# 生成线程堆栈快照
jstack [pid] > thread_dump.log
# 包含锁信息的线程转储
jstack -l [pid]
# 检测死锁
jstack -F [pid] | grep -A 30 "Found.*deadlock"
排查要点:查找BLOCKED状态的线程,分析线程间锁竞争,排查死锁或线程挂起问题。
10. jinfo - 查看和修改JVM参数
# 查看所有JVM参数
jinfo -flags [pid]
# 查看特定参数值
jinfo -flag MaxHeapSize [pid]
# 动态修改某些参数
jinfo -flag +HeapDumpOnOutOfMemoryError [pid]
排查要点:确认JVM关键参数是否正确配置,必要时动态调整。
11. jcmd - JVM诊断命令工具
# 列出所有可用命令
jcmd [pid] help
# 查看JVM版本信息
jcmd [pid] VM.version
# 执行GC
jcmd [pid] GC.run
# 生成堆转储
jcmd [pid] GC.heap_dump filename=heap.hprof
# 生成线程转储
jcmd [pid] Thread.print
排查要点:jcmd是一个多功能工具,可以替代多个单一功能的JDK工具,掌握它能简化问题排查流程。
12. jhat - 堆转储分析工具
# 分析堆转储文件
jhat heap_dump.hprof
# 然后访问 http://localhost:7000 查看分析结果
排查要点:在浏览器中查看对象实例、引用关系,找出可能的内存泄漏点。
网络相关命令
13. netstat - 网络连接状态
# 查看所有TCP连接
netstat -ant
# 查看监听端口
netstat -tnlp
# 查看特定进程的网络连接
netstat -anp | grep [pid]
排查要点:关注ESTABLISHED连接数、TIME_WAIT状态连接数,检查端口占用情况。
14. ss - 更快的socket统计
# 显示所有TCP连接
ss -ta
# 查看连接统计
ss -s
# 查看特定端口连接
ss -tn sport = :8080
排查要点:比netstat更高效,适合连接数较多的系统,可以快速统计各种连接状态。
15. lsof - 列出打开的文件
# 查看进程打开的所有文件
lsof -p [pid]
# 查看特定端口使用情况
lsof -i:8080
# 查看所有网络连接
lsof -i
排查要点:查看进程打开了哪些文件和网络连接,排查文件描述符泄露问题。
16. ping - 网络连通性测试
# 基本使用
ping www.example.com
# 限制发送次数
ping -c 5 www.example.com
排查要点:测试与目标主机的网络连通性和延迟情况。
17. curl - HTTP请求测试
# 简单GET请求
curl http://localhost:8080/api/status
# 带超时控制的请求
curl --connect-timeout 5 -m 10 http://api.example.com
# POST请求
curl -X POST -d '{"name":"test"}' -H "Content-Type: application/json" http://localhost:8080/api/users
排查要点:测试HTTP服务响应情况,检查响应码、响应时间和响应内容。
18. tcpdump - 网络数据包分析
# 捕获特定端口的数据包
tcpdump -i any port 8080 -n
# 捕获特定主机的数据包
tcpdump host 192.168.1.100
# 保存数据包到文件
tcpdump -i any -w capture.pcap
排查要点:分析网络数据包内容,排查网络协议相关问题,特别是网络延迟和连接重置问题。
19. traceroute - 路由跟踪
# 基本使用
traceroute www.example.com
排查要点:排查网络路由问题,确定网络延迟出现在哪个环节。
日志和文件分析命令
20. tail - 查看文件尾部
# 实时查看日志
tail -f app.log
# 显示最后100行
tail -n 100 app.log
# 从第1000行开始显示
tail -n +1000 app.log
排查要点:实时监控日志输出,是排查问题的基础操作。
21. grep - 文本搜索
# 搜索错误日志
grep "ERROR" app.log
# 显示匹配行的前后5行
grep -A 5 -B 5 "OutOfMemoryError" app.log
# 递归搜索多个文件
grep -r "Connection refused" /var/log/
排查要点:快速定位日志中的错误信息,是分析问题的有力工具。
22. awk - 文本处理
# 提取特定列
awk '{print $1, $4}' access.log
# 统计HTTP响应码分布
awk '{print $9}' access.log | sort | uniq -c | sort -nr
# 计算平均响应时间
awk '{sum+=$10; count++} END {print sum/count}' access.log
排查要点:对日志进行结构化分析,提取关键信息,进行统计计算。
23. sed - 流编辑器
# 替换文本
sed 's/ERROR/CRITICAL/g' app.log
# 只显示特定行范围
sed -n '1000,2000p' app.log
排查要点:处理和转换日志文本,提取特定行内容。
24. find - 文件查找
# 查找大文件
find / -type f -size +100M
# 查找最近修改的文件
find /var/log -mtime -1 -type f -name "*.log"
# 查找并删除老旧日志文件
find /var/log -name "*.log" -mtime +30 -exec rm {} ;
排查要点:定位占用空间大的文件,查找最近更改过的配置文件等。
25. du - 磁盘使用统计
# 查看目录大小
du -sh /var/log
# 按大小排序显示子目录
du -h --max-depth=1 /var | sort -hr
排查要点:分析磁盘空间占用情况,找出占用空间最大的目录。
进程管理命令
26. ps - 进程状态
# 查看所有进程
ps aux
# 查看特定用户的进程
ps -u tomcat
# 按CPU使用率排序
ps aux --sort=-%cpu | head -10
# 按内存使用率排序
ps aux --sort=-%mem | head -10
排查要点:查看进程状态、资源使用情况,识别异常进程。
27. pstree - 进程树
# 显示进程树
pstree
# 显示特定进程的进程树
pstree -p [pid]
排查要点:了解进程间的父子关系,特别是在排查守护进程和子进程问题时很有用。
28. kill - 发送信号给进程
# 正常终止进程
kill [pid]
# 强制终止进程
kill -9 [pid]
# 生成Java线程转储
kill -3 [java_pid]
排查要点:终止异常进程,或向Java进程发送信号生成诊断信息。
29. pkill - 按名称终止进程
# 终止特定名称的进程
pkill java
# 向所有Java进程发送SIGTERM信号
pkill -15 java
排查要点:批量操作特定类型的进程,在紧急情况下快速响应。
30. pgrep - 查找进程ID
# 查找Java进程ID
pgrep java
# 查找并显示命令行
pgrep -a java
排查要点:快速找到特定进程的PID,用于后续的监控和分析。
系统性能分析命令
31. sar - 系统活动报告
# 查看CPU使用情况
sar -u 1 5
# 查看内存使用
sar -r 1 5
# 查看磁盘IO
sar -b 1 5
# 查看网络统计
sar -n DEV 1 5
排查要点:综合分析系统资源使用情况,识别性能瓶颈。
32. mpstat - 多处理器统计
# 查看所有CPU核心使用情况
mpstat -P ALL 2 5
排查要点:分析各CPU核心的负载分布,检测是否存在单核心过载情况。
33. dmesg - 内核消息
# 查看内核消息
dmesg
# 只查看错误和警告
dmesg --level=err,warn
排查要点:查看系统错误和警告信息,特别是OOM(内存不足)等严重问题。
34. strace - 跟踪系统调用
# 跟踪指定进程
strace -p [pid]
# 跟踪特定系统调用
strace -e open,read,write -p [pid]
# 统计系统调用时间和次数
strace -c -p [pid]
排查要点:分析进程与系统的交互,排查系统调用级别的问题。
35. perf - 性能分析工具
# 记录性能数据
perf record -F 99 -p [pid] -g -- sleep 30
# 分析性能数据
perf report
排查要点:通过采样分析程序的CPU使用热点,定位性能瓶颈。
数据库相关命令
36. mysqladmin - MySQL服务器管理
# 查看MySQL状态
mysqladmin -u root -p status
# 进程列表
mysqladmin -u root -p processlist
# 变量状态
mysqladmin -u root -p variables
排查要点:检查MySQL服务器状态和配置,监控连接数和进程情况。
37. mysqlshow - 显示数据库信息
# 显示所有数据库
mysqlshow -u root -p
# 显示特定数据库的表
mysqlshow -u root -p database_name
排查要点:快速了解数据库结构和表信息。
38. pg_stat_activity - PostgreSQL活动查询
# 查看活动连接(在psql中执行)
SELECT * FROM pg_stat_activity;
# 查看长时间运行的查询
SELECT pid, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;
排查要点:检查PostgreSQL数据库中的活动连接和正在执行的查询,找出长时间运行的查询。
39. redis-cli - Redis客户端
# 连接Redis服务器
redis-cli
# 监控Redis命令
redis-cli monitor
# 获取统计信息
redis-cli info
排查要点:检查Redis服务器状态,监控命令执行,排查缓存相关问题。
容器和微服务相关命令
40. docker ps - 查看容器
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
排查要点:了解当前运行的容器及其状态。
41. docker logs - 查看容器日志
# 查看容器日志
docker logs [container_id]
# 实时查看日志
docker logs -f [container_id]
# 显示最近的100行日志
docker logs --tail 100 [container_id]
排查要点:查看容器内应用的日志输出,排查容器内部问题。
42. docker stats - 容器资源使用统计
# 查看所有容器的资源使用情况
docker stats
# 查看特定容器的资源使用
docker stats [container_id]
排查要点:监控容器的CPU、内存使用情况,发现资源瓶颈。
43. kubectl - Kubernetes命令行工具
# 获取所有Pod状态
kubectl get pods
# 查看Pod详细信息
kubectl describe pod [pod_name]
# 查看Pod日志
kubectl logs [pod_name]
# 进入Pod内执行命令
kubectl exec -it [pod_name] -- /bin/bash
排查要点:在Kubernetes环境中管理和排查容器化应用问题。
44. kubectl top - Kubernetes资源使用统计
# 查看节点资源使用
kubectl top nodes
# 查看Pod资源使用
kubectl top pods
排查要点:监控Kubernetes集群中各组件的资源使用情况。
专用工具命令
45. arthas - Java诊断工具
# 启动arthas
java -jar arthas-boot.jar
# 使用dashboard命令查看系统概况
dashboard
# 跟踪方法执行
trace com.example.Controller method
# 查看JVM信息
jvm
排查要点:Arthas是阿里开源的Java诊断工具,提供了更丰富的Java应用分析能力。
46. btrace - Java运行时追踪
# 使用BTrace脚本追踪方法
btrace [pid] ScriptFile.java
排查要点:在不重启应用的情况下,动态跟踪Java方法的执行情况。
47. jprofiler - 性能分析工具
# 启动jprofiler客户端
jprofiler
# 连接到远程JVM
jpenable
排查要点:进行更深入的性能分析,包括CPU热点、内存泄漏、线程分析等。
48. ab - Apache HTTP服务器基准测试
# 发送1000个请求,并发数100
ab -n 1000 -c 100 http://localhost:8080/api/test
排查要点:测试HTTP服务性能,检查在负载下的响应时间和吞吐量。
49. wrk - HTTP基准测试工具
# 运行30秒测试,使用12个线程和400个连接
wrk -t12 -c400 -d30s http://localhost:8080/api/test
排查要点:比ab更强大的HTTP压测工具,可以测试在高并发下应用的表现。
50. java-flight-recorder (JFR) - JVM飞行记录仪
# 启动JFR记录
jcmd [pid] JFR.start duration=60s filename=recording.jfr
# 检查JFR记录状态
jcmd [pid] JFR.check
# 停止JFR记录
jcmd [pid] JFR.stop
排查要点:收集JVM运行时的详细信息,用于后续分析和性能优化。
线上问题排查思路与方法
快速定位问题类型
- CPU问题排查路径:top → jstack → perf/JFR
- 内存问题排查路径:free → jmap → jhat/MAT
- 磁盘问题排查路径:df → du → lsof/find
- 网络问题排查路径:netstat → tcpdump → wireshark
- 应用异常排查路径:jps → logs → jstack → arthas
常见问题排查技巧
- CPU使用率高
# 查找占用CPU高的进程
top -c
# 如果是Java进程,生成线程转储
jstack [pid] > thread_dump.log
# 查找占用CPU高的线程
ps -mp [pid] -o THREAD,tid,time | sort -rk 3
# 将线程ID转为16进制
printf "%x\n" [tid]
# 在线程转储中查找该线程
grep -A 30 [hex_tid] thread_dump.log
- 内存泄漏
# 查看堆内存使用情况
jmap -heap [pid]
# 生成多个堆转储,比较对象增长
jmap -dump:format=b,file=heap1.hprof [pid]
# 等待一段时间后
jmap -dump:format=b,file=heap2.hprof [pid]
# 使用MAT或jhat分析堆转储
jhat heap2.hprof
- 频繁GC
# 监控GC情况
jstat -gc [pid] 1000
# 开启GC日志
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log
# 分析GC日志
# 使用GCViewer或GCEasy等工具
- 响应缓慢
# 查看系统负载
uptime
# 查看网络连接情况
netstat -ant | grep ESTABLISHED | wc -l
# 查看线程状态
jstack [pid] | grep -c "java.lang.Thread.State"
# 使用Arthas进行方法追踪
trace com.example.SlowService slowMethod
- 磁盘空间不足
# 查看磁盘使用情况
df -h
# 查找大文件
find / -type f -size +100M -exec ls -lh {} ;
# 查看目录大小
du -sh /*
# 清理日志文件
find /var/log -name "*.log.*" -mtime +7 -delete
总结
在实际排查过程中,通常需要组合使用这些命令,形成系统性的问题排查流程。
记住,成功的线上问题排查不仅依赖于命令的熟练使用,还取决于对Java应用架构、JVM原理和操作系统机制的深入理解。
作为Java开发者,建议平时就熟悉这些命令的使用,并在非生产环境进行实践,为真正的线上问题排查做好准备。同时,建立完善的监控系统和日志体系,能让问题排查事半功倍。