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
  1. 内存泄漏
# 查看堆内存使用情况
jmap -heap [pid]

# 生成多个堆转储,比较对象增长
jmap -dump:format=b,file=heap1.hprof [pid]
# 等待一段时间后
jmap -dump:format=b,file=heap2.hprof [pid]

# 使用MAT或jhat分析堆转储
jhat heap2.hprof
  1. 频繁GC
# 监控GC情况
jstat -gc [pid] 1000

# 开启GC日志
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log

# 分析GC日志
# 使用GCViewer或GCEasy等工具
  1. 响应缓慢
# 查看系统负载
uptime

# 查看网络连接情况
netstat -ant | grep ESTABLISHED | wc -l

# 查看线程状态
jstack [pid] | grep -c "java.lang.Thread.State"

# 使用Arthas进行方法追踪
trace com.example.SlowService slowMethod
  1. 磁盘空间不足
# 查看磁盘使用情况
df -h

# 查找大文件
find / -type f -size +100M -exec ls -lh {} ;

# 查看目录大小
du -sh /*

# 清理日志文件
find /var/log -name "*.log.*" -mtime +7 -delete

总结

在实际排查过程中,通常需要组合使用这些命令,形成系统性的问题排查流程。

记住,成功的线上问题排查不仅依赖于命令的熟练使用,还取决于对Java应用架构、JVM原理和操作系统机制的深入理解。

作为Java开发者,建议平时就熟悉这些命令的使用,并在非生产环境进行实践,为真正的线上问题排查做好准备。同时,建立完善的监控系统和日志体系,能让问题排查事半功倍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值