Java開發(fā)者進行線上問題排查的50個常用命令推薦
在生產(chǎn)環(huán)境中,當Java應用出現(xiàn)性能下降、響應緩慢、內(nèi)存泄漏或崩潰等問題時,快速有效的問題排查至關(guān)重要。
作為Java開發(fā)者,掌握一系列命令行工具能幫助你迅速定位問題根源,將損失降到最小。
本文匯總了50個Java開發(fā)者在線上環(huán)境排查問題時最常用的命令,涵蓋系統(tǒng)資源監(jiān)控、JVM分析、網(wǎng)絡(luò)檢測、日志處理等多個方面。
系統(tǒng)資源監(jiān)控命令
1. top - 系統(tǒng)進程實時監(jiān)控
# 基本使用 top # 按內(nèi)存排序 top -o %MEM # 只查看特定用戶的進程 top -u java_user # 監(jiān)控特定進程 top -p $(pgrep -d',' java)
排查要點:關(guān)注CPU使用率(%CPU)、內(nèi)存使用(%MEM)、運行時間(TIME+),可以快速發(fā)現(xiàn)資源占用異常的進程。
2. htop - 增強版系統(tǒng)監(jiān)控
htop
排查要點:比top提供更友好的界面,支持鼠標操作,可以查看每個CPU核心的使用情況,適合多核系統(tǒng)的監(jiān)控。
3. vmstat - 系統(tǒng)資源統(tǒng)計
# 每2秒輸出一次,共10次 vmstat 2 10
排查要點:關(guān)注r(運行隊列)、b(阻塞進程)、si/so(交換區(qū)使用)、us/sy(用戶CPU/系統(tǒng)CPU),可以判斷系統(tǒng)是CPU密集型還是IO密集型負載。
4. free - 內(nèi)存使用情況
# 顯示可讀格式 free -h # 每3秒更新一次 free -h -s 3
排查要點:檢查可用內(nèi)存(available)是否過低,swap使用是否過高,判斷是否存在內(nèi)存壓力。
5. iostat - IO統(tǒng)計信息
# 查看設(shè)備IO統(tǒng)計,每2秒一次,共5次 iostat -xd 2 5
排查要點:關(guān)注%util(設(shè)備利用率)、r/s和w/s(讀寫操作數(shù))、await(IO等待時間),判斷IO是否成為瓶頸。
JVM監(jiān)控命令
6. jps - 列出Java進程
# 列出簡單進程信息 jps # 列出完整的包名和進程參數(shù) jps -lvm
排查要點:這是排查Java問題的起點,首先需要確定目標Java進程的PID。
7. jstat - JVM統(tǒng)計信息監(jiān)控
# 監(jiān)控GC情況,每1000毫秒一次,共10次 jstat -gc [pid] 1000 10 # 查看類加載情況 jstat -class [pid] # 查看JIT編譯情況 jstat -compiler [pid]
排查要點:關(guān)注GC頻率、GC耗時、老年代空間使用情況,判斷是否存在GC問題。
8. jmap - 內(nèi)存映射
# 查看堆內(nèi)存使用概況 jmap -heap [pid] # 查看對象統(tǒng)計信息 jmap -histo [pid] | head -20 # 生成堆轉(zhuǎn)儲文件 jmap -dump:format=b,file=heap_dump.hprof [pid]
排查要點:分析內(nèi)存中大對象,檢查是否存在內(nèi)存泄漏,必要時生成堆轉(zhuǎn)儲文件進行詳細分析。
9. jstack - 線程堆棧分析
# 生成線程堆??煺? jstack [pid] > thread_dump.log # 包含鎖信息的線程轉(zhuǎn)儲 jstack -l [pid] # 檢測死鎖 jstack -F [pid] | grep -A 30 "Found.*deadlock"
排查要點:查找BLOCKED狀態(tài)的線程,分析線程間鎖競爭,排查死鎖或線程掛起問題。
10. jinfo - 查看和修改JVM參數(shù)
# 查看所有JVM參數(shù) jinfo -flags [pid] # 查看特定參數(shù)值 jinfo -flag MaxHeapSize [pid] # 動態(tài)修改某些參數(shù) jinfo -flag +HeapDumpOnOutOfMemoryError [pid]
排查要點:確認JVM關(guān)鍵參數(shù)是否正確配置,必要時動態(tài)調(diào)整。
11. jcmd - JVM診斷命令工具
# 列出所有可用命令 jcmd [pid] help # 查看JVM版本信息 jcmd [pid] VM.version # 執(zhí)行GC jcmd [pid] GC.run # 生成堆轉(zhuǎn)儲 jcmd [pid] GC.heap_dump filename=heap.hprof # 生成線程轉(zhuǎn)儲 jcmd [pid] Thread.print
排查要點:jcmd是一個多功能工具,可以替代多個單一功能的JDK工具,掌握它能簡化問題排查流程。
12. jhat - 堆轉(zhuǎn)儲分析工具
# 分析堆轉(zhuǎn)儲文件 jhat heap_dump.hprof # 然后訪問 http://localhost:7000 查看分析結(jié)果
排查要點:在瀏覽器中查看對象實例、引用關(guān)系,找出可能的內(nèi)存泄漏點。
網(wǎng)絡(luò)相關(guān)命令
13. netstat - 網(wǎng)絡(luò)連接狀態(tài)
# 查看所有TCP連接 netstat -ant # 查看監(jiān)聽端口 netstat -tnlp # 查看特定進程的網(wǎng)絡(luò)連接 netstat -anp | grep [pid]
排查要點:關(guān)注ESTABLISHED連接數(shù)、TIME_WAIT狀態(tài)連接數(shù),檢查端口占用情況。
14. ss - 更快的socket統(tǒng)計
# 顯示所有TCP連接 ss -ta # 查看連接統(tǒng)計 ss -s # 查看特定端口連接 ss -tn sport = :8080
排查要點:比netstat更高效,適合連接數(shù)較多的系統(tǒng),可以快速統(tǒng)計各種連接狀態(tài)。
15. lsof - 列出打開的文件
# 查看進程打開的所有文件 lsof -p [pid] # 查看特定端口使用情況 lsof -i:8080 # 查看所有網(wǎng)絡(luò)連接 lsof -i
排查要點:查看進程打開了哪些文件和網(wǎng)絡(luò)連接,排查文件描述符泄露問題。
16. ping - 網(wǎng)絡(luò)連通性測試
# 基本使用 ping www.example.com # 限制發(fā)送次數(shù) ping -c 5 www.example.com
排查要點:測試與目標主機的網(wǎng)絡(luò)連通性和延遲情況。
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服務(wù)響應情況,檢查響應碼、響應時間和響應內(nèi)容。
18. tcpdump - 網(wǎng)絡(luò)數(shù)據(jù)包分析
# 捕獲特定端口的數(shù)據(jù)包 tcpdump -i any port 8080 -n # 捕獲特定主機的數(shù)據(jù)包 tcpdump host 192.168.1.100 # 保存數(shù)據(jù)包到文件 tcpdump -i any -w capture.pcap
排查要點:分析網(wǎng)絡(luò)數(shù)據(jù)包內(nèi)容,排查網(wǎng)絡(luò)協(xié)議相關(guān)問題,特別是網(wǎng)絡(luò)延遲和連接重置問題。
19. traceroute - 路由跟蹤
# 基本使用 traceroute www.example.com
排查要點:排查網(wǎng)絡(luò)路由問題,確定網(wǎng)絡(luò)延遲出現(xiàn)在哪個環(huán)節(jié)。
日志和文件分析命令
20. tail - 查看文件尾部
# 實時查看日志 tail -f app.log # 顯示最后100行 tail -n 100 app.log # 從第1000行開始顯示 tail -n +1000 app.log
排查要點:實時監(jiān)控日志輸出,是排查問題的基礎(chǔ)操作。
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
# 統(tǒng)計HTTP響應碼分布
awk '{print $9}' access.log | sort | uniq -c | sort -nr
# 計算平均響應時間
awk '{sum+=$10; count++} END {print sum/count}' access.log排查要點:對日志進行結(jié)構(gòu)化分析,提取關(guān)鍵信息,進行統(tǒng)計計算。
23. sed - 流編輯器
# 替換文本 sed 's/ERROR/CRITICAL/g' app.log # 只顯示特定行范圍 sed -n '1000,2000p' app.log
排查要點:處理和轉(zhuǎn)換日志文本,提取特定行內(nèi)容。
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 - 磁盤使用統(tǒng)計
# 查看目錄大小 du -sh /var/log # 按大小排序顯示子目錄 du -h --max-depth=1 /var | sort -hr
排查要點:分析磁盤空間占用情況,找出占用空間最大的目錄。
進程管理命令
26. ps - 進程狀態(tài)
# 查看所有進程 ps aux # 查看特定用戶的進程 ps -u tomcat # 按CPU使用率排序 ps aux --sort=-%cpu | head -10 # 按內(nèi)存使用率排序 ps aux --sort=-%mem | head -10
排查要點:查看進程狀態(tài)、資源使用情況,識別異常進程。
27. pstree - 進程樹
# 顯示進程樹 pstree # 顯示特定進程的進程樹 pstree -p [pid]
排查要點:了解進程間的父子關(guān)系,特別是在排查守護進程和子進程問題時很有用。
28. kill - 發(fā)送信號給進程
# 正常終止進程 kill [pid] # 強制終止進程 kill -9 [pid] # 生成Java線程轉(zhuǎn)儲 kill -3 [java_pid]
排查要點:終止異常進程,或向Java進程發(fā)送信號生成診斷信息。
29. pkill - 按名稱終止進程
# 終止特定名稱的進程 pkill java # 向所有Java進程發(fā)送SIGTERM信號 pkill -15 java
排查要點:批量操作特定類型的進程,在緊急情況下快速響應。
30. pgrep - 查找進程ID
# 查找Java進程ID pgrep java # 查找并顯示命令行 pgrep -a java
排查要點:快速找到特定進程的PID,用于后續(xù)的監(jiān)控和分析。
系統(tǒng)性能分析命令
31. sar - 系統(tǒng)活動報告
# 查看CPU使用情況 sar -u 1 5 # 查看內(nèi)存使用 sar -r 1 5 # 查看磁盤IO sar -b 1 5 # 查看網(wǎng)絡(luò)統(tǒng)計 sar -n DEV 1 5
排查要點:綜合分析系統(tǒng)資源使用情況,識別性能瓶頸。
32. mpstat - 多處理器統(tǒng)計
# 查看所有CPU核心使用情況 mpstat -P ALL 2 5
排查要點:分析各CPU核心的負載分布,檢測是否存在單核心過載情況。
33. dmesg - 內(nèi)核消息
# 查看內(nèi)核消息 dmesg # 只查看錯誤和警告 dmesg --level=err,warn
排查要點:查看系統(tǒng)錯誤和警告信息,特別是OOM(內(nèi)存不足)等嚴重問題。
34. strace - 跟蹤系統(tǒng)調(diào)用
# 跟蹤指定進程 strace -p [pid] # 跟蹤特定系統(tǒng)調(diào)用 strace -e open,read,write -p [pid] # 統(tǒng)計系統(tǒng)調(diào)用時間和次數(shù) strace -c -p [pid]
排查要點:分析進程與系統(tǒng)的交互,排查系統(tǒng)調(diào)用級別的問題。
35. perf - 性能分析工具
# 記錄性能數(shù)據(jù) perf record -F 99 -p [pid] -g -- sleep 30 # 分析性能數(shù)據(jù) perf report
排查要點:通過采樣分析程序的CPU使用熱點,定位性能瓶頸。
數(shù)據(jù)庫相關(guān)命令
36. mysqladmin - MySQL服務(wù)器管理
# 查看MySQL狀態(tài) mysqladmin -u root -p status # 進程列表 mysqladmin -u root -p processlist # 變量狀態(tài) mysqladmin -u root -p variables
排查要點:檢查MySQL服務(wù)器狀態(tài)和配置,監(jiān)控連接數(shù)和進程情況。
37. mysqlshow - 顯示數(shù)據(jù)庫信息
# 顯示所有數(shù)據(jù)庫 mysqlshow -u root -p # 顯示特定數(shù)據(jù)庫的表 mysqlshow -u root -p database_name
排查要點:快速了解數(shù)據(jù)庫結(jié)構(gòu)和表信息。
38. pg_stat_activity - PostgreSQL活動查詢
# 查看活動連接(在psql中執(zhí)行) 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數(shù)據(jù)庫中的活動連接和正在執(zhí)行的查詢,找出長時間運行的查詢。
39. redis-cli - Redis客戶端
# 連接Redis服務(wù)器 redis-cli # 監(jiān)控Redis命令 redis-cli monitor # 獲取統(tǒng)計信息 redis-cli info
排查要點:檢查Redis服務(wù)器狀態(tài),監(jiān)控命令執(zhí)行,排查緩存相關(guān)問題。
容器和微服務(wù)相關(guān)命令
40. docker ps - 查看容器
# 查看運行中的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a
排查要點:了解當前運行的容器及其狀態(tài)。
41. docker logs - 查看容器日志
# 查看容器日志 docker logs [container_id] # 實時查看日志 docker logs -f [container_id] # 顯示最近的100行日志 docker logs --tail 100 [container_id]
排查要點:查看容器內(nèi)應用的日志輸出,排查容器內(nèi)部問題。
42. docker stats - 容器資源使用統(tǒng)計
# 查看所有容器的資源使用情況 docker stats # 查看特定容器的資源使用 docker stats [container_id]
排查要點:監(jiān)控容器的CPU、內(nèi)存使用情況,發(fā)現(xiàn)資源瓶頸。
43. kubectl - Kubernetes命令行工具
# 獲取所有Pod狀態(tài) kubectl get pods # 查看Pod詳細信息 kubectl describe pod [pod_name] # 查看Pod日志 kubectl logs [pod_name] # 進入Pod內(nèi)執(zhí)行命令 kubectl exec -it [pod_name] -- /bin/bash
排查要點:在Kubernetes環(huán)境中管理和排查容器化應用問題。
44. kubectl top - Kubernetes資源使用統(tǒng)計
# 查看節(jié)點資源使用 kubectl top nodes # 查看Pod資源使用 kubectl top pods
排查要點:監(jiān)控Kubernetes集群中各組件的資源使用情況。
專用工具命令
45. arthas - Java診斷工具
# 啟動arthas java -jar arthas-boot.jar # 使用dashboard命令查看系統(tǒng)概況 dashboard # 跟蹤方法執(zhí)行 trace com.example.Controller method # 查看JVM信息 jvm
排查要點:Arthas是阿里開源的Java診斷工具,提供了更豐富的Java應用分析能力。
46. btrace - Java運行時追蹤
# 使用BTrace腳本追蹤方法 btrace [pid] ScriptFile.java
排查要點:在不重啟應用的情況下,動態(tài)跟蹤Java方法的執(zhí)行情況。
47. jprofiler - 性能分析工具
# 啟動jprofiler客戶端 jprofiler # 連接到遠程JVM jpenable
排查要點:進行更深入的性能分析,包括CPU熱點、內(nèi)存泄漏、線程分析等。
48. ab - Apache HTTP服務(wù)器基準測試
# 發(fā)送1000個請求,并發(fā)數(shù)100 ab -n 1000 -c 100 http://localhost:8080/api/test
排查要點:測試HTTP服務(wù)性能,檢查在負載下的響應時間和吞吐量。
49. wrk - HTTP基準測試工具
# 運行30秒測試,使用12個線程和400個連接 wrk -t12 -c400 -d30s http://localhost:8080/api/test
排查要點:比ab更強大的HTTP壓測工具,可以測試在高并發(fā)下應用的表現(xiàn)。
50. java-flight-recorder (JFR) - JVM飛行記錄儀
# 啟動JFR記錄 jcmd [pid] JFR.start duration=60s filename=recording.jfr # 檢查JFR記錄狀態(tài) jcmd [pid] JFR.check # 停止JFR記錄 jcmd [pid] JFR.stop
排查要點:收集JVM運行時的詳細信息,用于后續(xù)分析和性能優(yōu)化。
線上問題排查思路與方法
快速定位問題類型
1. CPU問題排查路徑:top → jstack → perf/JFR
2. 內(nèi)存問題排查路徑:free → jmap → jhat/MAT
3. 磁盤問題排查路徑:df → du → lsof/find
4. 網(wǎng)絡(luò)問題排查路徑:netstat → tcpdump → wireshark
5.應用異常排查路徑:jps → logs → jstack → arthas
常見問題排查技巧
1. CPU使用率高
# 查找占用CPU高的進程 top -c # 如果是Java進程,生成線程轉(zhuǎn)儲 jstack [pid] > thread_dump.log # 查找占用CPU高的線程 ps -mp [pid] -o THREAD,tid,time | sort -rk 3 # 將線程ID轉(zhuǎn)為16進制 printf "%x\n" [tid] # 在線程轉(zhuǎn)儲中查找該線程 grep -A 30 [hex_tid] thread_dump.log
2. 內(nèi)存泄漏
# 查看堆內(nèi)存使用情況 jmap -heap [pid] # 生成多個堆轉(zhuǎn)儲,比較對象增長 jmap -dump:format=b,file=heap1.hprof [pid] # 等待一段時間后 jmap -dump:format=b,file=heap2.hprof [pid] # 使用MAT或jhat分析堆轉(zhuǎn)儲 jhat heap2.hprof
3. 頻繁GC
# 監(jiān)控GC情況 jstat -gc [pid] 1000 # 開啟GC日志 java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log # 分析GC日志 # 使用GCViewer或GCEasy等工具
4. 響應緩慢
# 查看系統(tǒng)負載 uptime # 查看網(wǎng)絡(luò)連接情況 netstat -ant | grep ESTABLISHED | wc -l # 查看線程狀態(tài) 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總結(jié)
在實際排查過程中,通常需要組合使用這些命令,形成系統(tǒng)性的問題排查流程。
記住,成功的線上問題排查不僅依賴于命令的熟練使用,還取決于對Java應用架構(gòu)、JVM原理和操作系統(tǒng)機制的深入理解。
作為Java開發(fā)者,建議平時就熟悉這些命令的使用,并在非生產(chǎn)環(huán)境進行實踐,為真正的線上問題排查做好準備。同時,建立完善的監(jiān)控系統(tǒng)和日志體系,能讓問題排查事半功倍。
以上就是Java開發(fā)者進行線上問題排查的50個常用命令推薦 的詳細內(nèi)容,更多關(guān)于Java線上問題排查命令的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java Mybatis架構(gòu)設(shè)計深入了解
在本篇文章里小編給大家整理的是一篇關(guān)于Java Mybatis架構(gòu)設(shè)計詳解內(nèi)容,對此有興趣的朋友們可以參考下,希望能夠給你帶來幫助2021-11-11
springboot如何接收復雜參數(shù)(同時接收JSON與文件)
文章介紹了在Spring Boot中同時處理JSON和文件上傳時使用`@RequestPart`注解的方法,`@RequestPart`可以接收多種格式的參數(shù),包括JSON和文件,并且可以作為`multipart/form-data`格式中的key2025-02-02
Java用單向環(huán)形鏈表來解決約瑟夫環(huán)Josepfu問題
如果把單鏈表的最后一個節(jié)點的指針指向鏈表頭部,而不是指向NULL,那么就構(gòu)成了一個單向循環(huán)鏈表,通俗講就是把尾節(jié)點的下一跳指向頭結(jié)點2021-10-10
從零開始讓你的Spring?Boot項目跑在Linux服務(wù)器
這篇文章主要給大家介紹了如何從零開始讓你的Spring?Boot項目跑在Linux服務(wù)器的相關(guān)資料,由于springboot是內(nèi)嵌了tomcat,所以可以直接將項目打包上傳至服務(wù)器上,需要的朋友可以參考下2021-11-11
使用Spring開啟@Async異步方式(javaconfig配置)
這篇文章主要介紹了使用Spring開啟@Async異步方式(javaconfig配置),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

