Java命令学习系列(一)——Jps
轉載自?Java命令學習系列(一)——Jps
jps位于jdk的bin目錄下,其作用是顯示當前系統的java進程情況,及其id號。 jps相當于Solaris進程工具ps。不象"pgrep java"或"ps -ef grep java",jps并不使用應用程序名來查找JVM實例。因此,它查找所有的Java應用程序,包括即使沒有使用java執行體的那種(例如,定制的啟動 器)。另外,jps僅查找當前用戶的Java進程,而不是當前系統中的所有進程。
位置
我們知道,很多Java命令都在jdk的JAVA_HOME/bin/目錄下面,jps也不例外,他就在bin目錄下,所以,他是java自帶的一個命令。
功能
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進程,只是把這個目錄里的文件名列一下而已。 至于系統的參數什么,就可以解析這幾個文件獲得。
hollis@hos:/tmp/hsperfdata_hollis$ pwd /tmp/hsperfdata_hollis hollis@hos:/tmp/hsperfdata_hollis$ ll total 48 drwxr-xr-x 2 hollis hollis ?4096 ?4月 16 10:54 ./ drwxrwxrwt 7 root ? root ? 12288 ?4月 16 10:56 ../ -rw------- 1 hollis hollis 32768 ?4月 16 10:57 2679 hollis@hos:/tmp/hsperfdata_hollis$上面的內容就是我機器中/tmp/hsperfdata_hollis目錄下的內容,其中2679就是我機器上當前運行中的java的進程的pid,我們執行jps驗證一下:
hollis@hos:/tmp/hsperfdata_hollis$ jps 2679 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar 4445 Jps執行了jps命令之后,我們發現有兩個java進程,一個是pid為2679的eclipse運行的進程,另外一個是pid為4445的jps使用的進程(他也是java命令,也要開一個進程)
使用
想要學習一個命令,先來看看幫助,使用jps -help查看幫助:
hollis@hos:/tmp/hsperfdata_hollis$ jps -help usage: jps [-help]jps [-q] [-mlvV] [<hostid>]Definitions:<hostid>: ? ? ?<hostname>[:<port>]接下來,為了詳細介紹這些參數,我們編寫幾個類,在main方法里寫一個while(true)的循環,查看java進程情況。代碼如下:
package com.JavaCommand; /*** @author hollis*/ public class JpsDemo {public static void main(String[] args) {while(true){System.out.println(1);}} }-q 只顯示pid,不顯示class名稱,jar文件名和傳遞給main 方法的參數
hollis@hos:/tmp/hsperfdata_hollis$ jps -q 2679 11421-m 輸出傳遞給main 方法的參數,在嵌入式jvm上可能是null,?在這里,在啟動main方法的時候,我給String[] args傳遞兩個參數。hollis,chuang,執行jsp -m:
hollis@hos:/tmp/hsperfdata_hollis$ jps -m 12062 JpsDemo hollis,chuang-l 輸出應用程序main class的完整package名 或者 應用程序的jar文件完整路徑名
hollis@hos:/tmp/hsperfdata_hollis$ jps -l 12356 sun.tools.jps.Jps 2679 /home/hollis/tools/eclipse//plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar 12329 com.JavaCommand.JpsDemo-v 輸出傳遞給JVM的參數?在這里,在啟動main方法的時候,我給jvm傳遞一個參數:-Dfile.encoding=UTF-8,執行jps -v:
hollis@hos:/tmp/hsperfdata_hollis$ jps -v 2679 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar -Djava.library.path=/usr/lib/jni:/usr/lib/x86_64-linux-gnu/jni -Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms40m -Xmx512m 13157 Jps -Denv.class.path=/home/hollis/tools/java/jdk1.7.0_71/lib:/home/hollis/tools/java/jdk1.7.0_71/jre/lib: -Dapplication.home=/home/hollis/tools/java/jdk1.7.0_71 -Xms8m 13083 JpsDemo -Dfile.encoding=UTF-8PS:jps命令有個地方很不好,似乎只能顯示當前用戶的java進程,要顯示其他用戶的還是只能用unix/linux的ps命令。
jps是我最常用的java命令。使用jps可以查看當前有哪些Java進程處于運行狀態。如果我運行了一個web應用(使用tomcat、jboss、jetty等啟動)的時候,我就可以使用jps查看啟動情況。有的時候我想知道這個應用的日志會輸出到哪里,或者啟動的時候使用了哪些javaagent,那么我可以使用jps -v?查看進程的jvm參數情況。
JPS失效處理
現象:?用ps -ef|grep java能看到啟動的java進程,但是用jps查看卻不存在該進程的id。待會兒解釋過之后就能知道在該情況下,jconsole、jvisualvm可能無法監控該進程,其他java自帶工具也可能無法使用
分析:?jps、jconsole、jvisualvm等工具的數據來源就是這個文件(/tmp/hsperfdata_userName/pid)。所以當該文件不存在或是無法讀取時就會出現jps無法查看該進程號,jconsole無法監控等問題
原因:
(1)、磁盤讀寫、目錄權限問題 若該用戶沒有權限寫/tmp目錄或是磁盤已滿,則無法創建/tmp/hsperfdata_userName/pid文件。或該文件已經生成,但用戶沒有讀權限
(2)、臨時文件丟失,被刪除或是定期清理 對于linux機器,一般都會存在定時任務對臨時文件夾進行清理,導致/tmp目錄被清空。這也是我第一次碰到該現象的原因。常用的可能定時刪除臨時目錄的工具為crontab、redhat的tmpwatch、ubuntu的tmpreaper等等
這個導致的現象可能會是這樣,用jconsole監控進程,發現在某一時段后進程仍然存在,但是卻沒有監控信息了。
(3)、java進程信息文件存儲地址被設置,不在/tmp目錄下 上面我們在介紹時說默認會在/tmp/hsperfdata_userName目錄保存進程信息,但由于以上1、2所述原因,可能導致該文件無法生成或是丟失,所以java啟動時提供了參數(-Djava.io.tmpdir),可以對這個文件的位置進行設置,而jps、jconsole都只會從/tmp目錄讀取,而無法從設置后的目錄讀物信息,這是我第二次碰到該現象的原因
附:
1.如何給main傳遞參數 在eclipse中,鼠標右鍵->Run As->Run COnfiguations->Arguments->在Program arguments中寫下要傳的參數值
1.如何給JVM傳遞參數 在eclipse中,鼠標右鍵->Run As->Run COnfiguations->Arguments->在VM arguments中寫下要傳的參數值(一般以-D開頭)
總結
以上是生活随笔為你收集整理的Java命令学习系列(一)——Jps的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cad2014安装配置安装点不上?
- 下一篇: 三星s8怎么在手机上看配置?