Java 應用線上問題排查常用命令大全
前言
在生產環境中,Java應用難免會出現性能下降、響應緩慢、內存泄漏或崩潰等問題。這些問題若不能及時解決,可能會給業務帶來嚴重損失。而掌握一系列實用的命令行工具,能幫助開發者迅速定位問題根源,將損失降到最低。
系統資源監控命令
系統資源的使用情況往往是影響Java應用運行的關鍵因素,當應用出現問題時,首先要關注系統的 CPU、內存、磁盤和進程等資源狀況。
top 命令
top命令是Linux系統中常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用情況。它可以按照CPU使用率、內存使用率等對進程進行排序,方便開發者快速找到資源消耗較高的進程。
在top命令的交互界面中,按P可按CPU使用率降序排列進程,按M可按內存使用率降序排列進程,按q則可以退出top命令。通過top命令,我們能直觀地看到Java進程的CPU占用率、內存占用率等信息。如果Java進程的CPU占用率過高,可能是應用中存在死循環、頻繁的GC等問題;如果內存占用持續升高,可能存在內存泄漏的風險。
# 基本使用
top
# 按內存排序
top -o %MEM
# 只查看特定用戶的進程
top -u java_user
# 監控特定進程
top -p $(pgrep -d',' java)free 命令
free命令用于顯示系統內存的使用情況,包括總內存、已使用內存、空閑內存、共享內存、緩沖和緩存等信息。常用的參數是-h,它可以以人類可讀的方式顯示內存大小,如MB、GB等。
例如,執行free -h命令后,會顯示總內存(total)、已使用內存(used)、空閑內存(free)、可用內存(available)等信息。通過查看可用內存,如果可用內存過低,可能會導致應用因為內存不足而出現響應緩慢甚至崩潰的情況。若系統內存緊張,可能需要考慮優化應用的內存使用,或者增加服務器的內存資源。
# 顯示可讀格式
free -h
# 每3秒更新一次
free -h -s 3df 命令
df命令用于查看文件系統的磁盤空間使用情況。使用df -h命令可以以人類可讀的形式顯示各個分區的總容量、已使用容量、可用容量以及使用率等信息。
當Java應用涉及大量文件操作,如日志寫入、數據存儲等,磁盤空間不足可能會導致應用無法正常寫入數據,進而出現異常。通過df命令可以及時發現磁盤空間是否緊張,若某個分區的使用率過高,需要及時清理無用文件或擴展磁盤空間。
ps 命令
ps命令用于查看系統中的進程狀態。常用的參數組合是ps -ef,它可以顯示系統中所有進程的詳細信息,包括進程ID(PID)、父進程ID(PPID)、進程的啟動時間、命令名稱等。
要查看Java應用相關的進程,可以使用ps -ef | grep java命令,這樣能過濾出所有Java進程。通過該命令可以獲取Java進程的PID,這對于后續進行JVM分析等操作非常重要。
JVM 分析命令
JVM的運行狀態直接關系到Java應用的性能,當應用出現性能問題或內存相關問題時,需要對JVM進行深入分析。
jps 命令
jps命令是Java提供的一個查看當前Java進程的工具,它可以列出正在運行的Java進程的PID和主類名稱。與ps命令相比,jps命令更專注于Java進程,使用起來更加簡潔方便。
執行jps命令后,會顯示當前系統中所有Java進程的PID和對應的主類名。例如,可能會顯示12345 Main,其中 12345是進程PID,Main是應用的主類。通過jps命令可以快速獲取Java應用的PID,為后續使用其他JVM分析命令奠定基礎。
# 列出簡單進程信息
jps
# 列出完整的包名和進程參數
jps -lvmjstat 命令
jstat命令用于監控JVM的統計信息,包括類加載、垃圾回收、JIT編譯等情況。它可以幫助開發者了解JVM的運行狀態,判斷是否存在GC過于頻繁、內存泄漏等問題。 常用的參數有:
- -class:顯示類加載、卸載數量、總空間以及類加載所消耗的時間。
- -gc:顯示GC相關的堆信息,包括Eden區、Survivor區、老年代等的容量、已使用空間、GC時間等。
- -gccapacity:顯示各個代的容量及使用情況。
- -gcutil:顯示GC相關的堆內存使用百分比。
# 監控GC情況,每1000毫秒一次,共10次
jstat -gc [pid] 1000 10
# 查看類加載情況
jstat -class [pid]
# 查看JIT編譯情況
jstat -compiler [pid]jmap 命令
jmap命令用于生成Java進程的內存快照(heap dump),以及查看堆內存的使用情況。內存快照可以用于后續的詳細分析,幫助開發者找出內存泄漏的具體位置。 生成內存快照的命令是jmap -dump:format=b,file=heapdump.hprof 12345,其中format=b表示生成二進制格式的快照文件,file=heapdump.hprof指定快照文件的名稱,12345是Java進程的PID。生成的快照文件可以使用JVisualVM、MAT等工具進行分析。
另外,使用jmap -histo:live 12345命令可以查看當前堆中存活對象的統計信息,包括類名、對象數量、占用內存大小等。通過該命令可以發現哪些類的對象數量異常增多,從而為定位內存泄漏問題提供線索。
# 查看堆內存使用概況
jmap -heap [pid]
# 查看對象統計信息
jmap -histo [pid] | head -20
# 生成堆轉儲文件
jmap -dump:format=b,file=heap_dump.hprof [pid]jstack 命令
jstack命令用于生成Java進程中線程的堆棧跟蹤信息。當應用出現死鎖、線程阻塞等問題時,通過分析線程堆棧可以找出問題所在。
執行jstack 12345命令可以生成指定Java 進程(PID為12345)的線程堆棧信息。在生成的堆棧信息中,可以查看每個線程的狀態,如RUNNABLE(運行中)、BLOCKED(阻塞)、WAITING(等待)等。如果存在死鎖,jstack命令會在輸出信息中明確指出死鎖的相關線程和鎖信息。通過分析線程的調用棧,還可以發現線程是否在某個方法上長時間停留,進而找到導致響應緩慢的原因。
# 生成線程堆棧快照
jstack [pid] > thread_dump.log
# 包含鎖信息的線程轉儲
jstack -l [pid]
# 檢測死鎖
jstack -F [pid] | grep -A 30 "Found.*deadlock"網絡檢測命令
Java應用通常需要與其他服務進行網絡通信,當出現通信異常、響應緩慢等問題時,網絡檢測命令能幫助我們排查網絡相關的故障。
netstat 命令
netstat命令用于顯示網絡連接、路由表、接口狀態等網絡相關信息。通過它可以查看Java應用的網絡連接情況,如連接的源IP、目標 IP、端口狀態等。
常用的參數組合有netstat -tuln,用于顯示所有正在監聽的TCP和UDP端口;netstat -an用于顯示所有網絡連接的狀態。如果 Java 應用需要對外提供服務,可以通過netstat -tuln查看應用監聽的端口是否正確開啟;通過netstat -an | grep 端口號可以查看該端口的連接情況,若存在大量的TIME_WAIT狀態連接,可能會影響新連接的建立。
# 查看所有TCP連接
netstat -ant
# 查看監聽端口
netstat -tnlp
# 查看特定進程的網絡連接
netstat -anp | grep [pid]ping 命令
ping命令用于測試與目標主機的網絡連通性。它通過發送ICMP回聲請求報文,并接收回聲應答報文來判斷網絡是否通暢。
執行ping 目標 IP 或域名命令后,可以查看數據包的發送和接收情況、往返時間(RTT)等信息。如果無法收到目標主機的應答,可能是網絡鏈路出現故障、目標主機不可達等原因;如果往返時間過長,說明網絡延遲較大,可能會影響Java應用與目標服務的通信效率。
# 基本使用
ping www.example.com
# 限制發送次數
ping -c 5 www.example.comtelnet 命令
telnet命令用于遠程登錄目標主機,也可以用于測試目標主機的某個端口是否可通。當Java應用無法連接到其他服務時,可以使用telnet命令檢測目標服務的端口是否開放。
執行telnet 目標 IP 端口號命令,如果能夠成功連接,說明目標端口是開放的;如果連接失敗,可能是目標端口未開放、網絡防火墻阻止等原因。例如,若Java應用連接數據庫時出現異常,可以使用telnet命令測試數據庫服務器的端口是否可通,以排除網絡連接問題。
tcpdump 命令
分析網絡數據包內容,排查網絡協議相關問題,特別是網絡延遲和連接重置問題
# 捕獲特定端口的數據包
tcpdump -i any port 8080 -n
# 捕獲特定主機的數據包
tcpdump host 192.168.1.100
# 保存數據包到文件
tcpdump -i any -w capture.pcap日志處理命令
Java應用的日志中記錄了大量的運行信息,包括錯誤信息、警告信息、業務處理過程等,通過分析日志可以快速定位問題。
tail 命令
tail命令用于查看文件的末尾內容,在日志查看中非常實用。由于日志文件通常會不斷增長,使用tail命令可以實時查看最新的日志信息。
常用的參數是-f,執行tail -f 日志文件路徑命令可以實時跟蹤日志文件的變化,當有新的日志內容寫入時,會立即顯示在終端上。當應用出現問題時,通過tail -f命令實時查看日志,能及時發現錯誤信息、異常堆棧等關鍵內容。
grep 命令
grep命令用于在文件中搜索指定的字符串模式,它可以從大量的日志信息中快速篩選出需要的內容。
例如,要在日志文件中搜索包含ERROR的行,可以執行grep "ERROR" 日志文件路徑命令;如果要搜索包含ERROR或WARN的行,可以使用grep -E "ERROR|WARN" 日志文件路徑命令;若要顯示匹配行及其前后的若干行內容,可以使用grep -A 5 -B 3 "ERROR日志文件路徑,其中-A 5表示顯示匹配行后面的5行,-B 3表示顯示匹配行前面的3行。通過 grep 命令,能快速從海量日志中找到與問題相關的信息。
less 命令
less命令用于分頁查看文件內容,對于大型日志文件,使用less命令可以更方便地瀏覽和查找信息。
執行less 日志文件路徑命令后,可以使用方向鍵上下滾動查看文件內容,按/鍵可以輸入要搜索的字符串,按n鍵查找下一個匹配項,按N鍵查找上一個匹配項,按q鍵退出less命令。與cat命令相比,less命令不會一次性加載整個文件,對于大型日志文件來說,更加高效。




















