1、功能
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一個顯示當前用戶的所有java進程pid的命令 如下;
2、位置
jps 命令位於$JAVA_HOME/bin目錄下
3、jps 用法
沒有添加參數的時候,默認列出vm的標識符號即java的進程id和簡單的class或者jar 的名稱 如下圖所示
-q 參數只顯示pid,不顯示class名稱,jar文件名,傳遞給main方法的參數
-l 參數 輸出應用程序main class的完整package名或者 應用程序的jar文件完整路徑名
-m 參數 顯示在啟動main方法的時候,傳遞給main方法的參數 String[] args,我這里傳遞的是helloword
-v 參數 顯示啟動應用程序時通過-D參數設置的應用程序屬性值
4、jps 失效問題排查
在環境中有可能jps,jstatck等命令失效,查看不到進程pid或者jconsole,jvisualvm等工具打開查看不到進程pid,linux 的ps命令可以看到進程的pid
因為啟動Java應用后,會在/tmp目錄生成了一個hsperfdata_$USER文件夾,該文件夾(/tmp/hsperfdata_$USER/pid)下面存儲的是各個java應用程序啟動的進程的pid,
由於jps、jstack、jconsole、jvisualvm等命令和工具都是讀取這個目錄下面的文件,所以當該文件不存在或是無法讀取時就會出現無法查看該進程號
原因:(1)默認情況下,/tmp目錄所有者和所屬組為root,權限為777,即所有人都有讀寫權限。出於系統安全等因素考慮,有些系統管理員會進行優化,使/tmp目錄不可寫,比如將權限改為750,或者干脆直接將其掛載為不可寫的分區等。
(2)除權限導致不可寫之外,該目錄所在分區已滿(使用率100%),同樣會造成該目錄不可寫,使用df -lh命令查看使用情況。
(3)啟動的時候添加 -XX:-UsePerfData 參數關閉了性能監控
5、 java.io.tmpdir
由於很多應用默認都要往該目錄下寫臨時文件,此時如果該目錄不可寫,應用運行就可能出現問題,比如Java應用。Java應用除了要往臨時目錄寫入一些臨時數據外,還包括性能監控數據,這就是所說的hsperfdata_$USER
目錄,
前者可以使用系統變量java.io.tmpdir
修改為其他目錄,例如-Djava.io.tmpdir=/opt/tmpdir
,但是hsperfdata_$USER
目前好像並沒有方法可以修改,只能在系統臨時目錄下生成
需要注意的是,如果java.io.tmpdir
指向的目錄不可寫,那么應用就可能起不來了。