Java开发者进行线上问题排查的50个常用命令推荐
作者:风象南
在生产环境中,当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运行时的详细信息,用于后续分析和性能优化。
线上问题排查思路与方法
快速定位问题类型
1. CPU问题排查路径:top → jstack → perf/JFR
2. 内存问题排查路径:free → jmap → jhat/MAT
3. 磁盘问题排查路径:df → du → lsof/find
4. 网络问题排查路径:netstat → tcpdump → wireshark
5.应用异常排查路径:jps → logs → jstack → arthas
常见问题排查技巧
1. 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
2. 内存泄漏
# 查看堆内存使用情况 jmap -heap [pid] # 生成多个堆转储,比较对象增长 jmap -dump:format=b,file=heap1.hprof [pid] # 等待一段时间后 jmap -dump:format=b,file=heap2.hprof [pid] # 使用MAT或jhat分析堆转储 jhat heap2.hprof
3. 频繁GC
# 监控GC情况 jstat -gc [pid] 1000 # 开启GC日志 java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log # 分析GC日志 # 使用GCViewer或GCEasy等工具
4. 响应缓慢
# 查看系统负载 uptime # 查看网络连接情况 netstat -ant | grep ESTABLISHED | wc -l # 查看线程状态 jstack [pid] | grep -c "java.lang.Thread.State" # 使用Arthas进行方法追踪 trace com.example.SlowService slowMethod
5. 磁盘空间不足
# 查看磁盘使用情况 df -h # 查找大文件 find / -type f -size +100M -exec ls -lh {} ; # 查看目录大小 du -sh /* # 清理日志文件 find /var/log -name "*.log.*" -mtime +7 -delete
总结
在实际排查过程中,通常需要组合使用这些命令,形成系统性的问题排查流程。
记住,成功的线上问题排查不仅依赖于命令的熟练使用,还取决于对Java应用架构、JVM原理和操作系统机制的深入理解。
作为Java开发者,建议平时就熟悉这些命令的使用,并在非生产环境进行实践,为真正的线上问题排查做好准备。同时,建立完善的监控系统和日志体系,能让问题排查事半功倍。
以上就是Java开发者进行线上问题排查的50个常用命令推荐 的详细内容,更多关于Java线上问题排查命令的资料请关注脚本之家其它相关文章!