1. JPS
jps工具位于%JAVA_HOME%\bin目錄下,用于顯示所有java進(jìn)程pid的命令,適合在linux/unix平臺上查看當(dāng)前java進(jìn)程的一些簡單情況。
java程序啟動后,會在java.ip.tmpdir目錄下,產(chǎn)生一個(gè)hsperfdata_username的文件夾,每一個(gè)java進(jìn)程都會在該文件夾下生成一個(gè)以java pid為文件名的文件,文件內(nèi)容包含一系列進(jìn)程詳情。所以jps命令的執(zhí)行只是簡單列出文件夾所有文件名稱和解析文件內(nèi)容顯示而已。
但是jps只能查看當(dāng)前用戶下啟動的java進(jìn)程
jps參數(shù)
- -q 不顯示class名稱,jar文件名和傳遞給main 方法的參數(shù)
- -m 輸出傳遞給main 方法的參數(shù)
- -l 輸出應(yīng)用程序main class的完整package名 或者 應(yīng)用程序的jar文件完整路徑名
- -v 輸出傳遞給JVM的參數(shù)
例:
2. jstack
jstack主要用來查看某個(gè)Java進(jìn)程內(nèi)的線程堆棧信息。其用法如下:
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
相關(guān)參數(shù)如下:
- -l long listings,會打印出額外的鎖信息,在發(fā)生死鎖時(shí)可以用jstack -l pid來觀察鎖持有情況
- -m mixed mode,不僅會輸出Java堆棧信息,還會輸出C/C++堆棧信息(比如Native方法)
jstack可以導(dǎo)出線程堆棧,通過線程堆棧可以定位到具體代碼。
線上報(bào)警的基本處理方案:
- jps -l 得到j(luò)ava進(jìn)行的進(jìn)程id(13176)
- top -H -p 13176 獲得進(jìn)程13176的線程占用資源情況
- 按cpu使用情況排序(shift + p),觀察線程占用cpu情況,得到最耗用CPU的線程id為20296
- dump出線程堆棧信息, jstack 13176 >> jstack.log
- 查找最耗cpu的線程的堆棧情況,printf '%x' 20296 (4f48)
- 根據(jù)4f48查看堆棧的信息,定位具體代碼分析問題
