Java命令列工具 -- jps
功能
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一個顯示當前所有java程序pid的命令,簡單實用,非常適合在linux/unix平臺上簡單察看當前java程序的一些簡單情況。
原理
jdk中的jps命令可以顯示當前執行的java程序以及相關引數,它的實現機制如下:
java程式在啟動以後,會在java.io.tmpdir指定的目錄下,就是臨時資料夾裡,生成一個類似於hsperfdata_User的資料夾,這個資料夾裡(在Linux中為/tmp/hsperfdata_{userName}/),有幾個檔案,名字就是java程序的pid,因此列出當前執行的java程序,只是把這個目錄裡的檔名列一下而已。 至於系統的引數什麼,就可以解析這幾個檔案獲得。
上面的內容就是我機器中/tmp/hsperfdata_hollis目錄下的內容,其中2756, 2975就是我機器上當前執行中的java的程序的pid,我們執行jps驗證一下:
使用
先來看看幫助,使用jps -help檢視幫助。
-q 只顯示pid,不顯示class名稱,jar檔名和傳遞給main 方法的引數。
-m 輸出傳遞給main 方法的引數,在嵌入式jvm上可能是null。
-l 輸出應用程式main class的完整package名 或者 應用程式的jar檔案完整路徑名。
- -v 輸出傳遞給JVM的引數
JPS失效
現象: 用ps -ef|grep java能看到啟動的java程序,但是用jps檢視卻不存在該程序的id。待會兒解釋過之後就能知道在該情況下,jconsole、jvisualvm可能無法監控該程序,其他java自帶工具也可能無法使用
分析: jps、jconsole、jvisualvm等工具的資料來源就是這個檔案(/tmp/hsperfdata_userName/pid)。所以當該檔案不存在或是無法讀取時就會出現jps無法檢視該程序號,jconsole無法監控等問題
原因:
- 磁碟讀寫、目錄許可權問題 若該使用者沒有許可權寫/tmp目錄或是磁碟已滿,則無法建立/tmp/hsperfdata_userName/pid檔案。或該檔案已經生成,但使用者沒有讀許可權
- 臨時檔案丟失,被刪除或是定期清理 對於linux機器,一般都會存在定時任務對臨時資料夾進行清理,導致/tmp目錄被清空。這也是我第一次碰到該現象的原因。常用的可能定時刪除臨時目錄的工具為crontab、redhat的tmpwatch、ubuntu的tmpreaper等等
這個導致的現象可能會是這樣,用jconsole監控程序,發現在某一時段後進程仍然存在,但是卻沒有監控資訊了。 - java程序資訊檔案儲存地址被設定,不在/tmp目錄下 上面我們在介紹時說預設會在/tmp/hsperfdata_userName目錄儲存程序資訊,但由於以上1、2所述原因,可能導致該檔案無法生成或是丟失,所以java啟動時提供了引數(-Djava.io.tmpdir),可以對這個檔案的位置進行設定,而jps、jconsole都只會從/tmp目錄讀取,而無法從設定後的目錄讀物資訊,這是我第二次碰到該現象的原因