jps位於jdk的bin目錄下,其做用是顯示當前系統的java進程狀況,及其id號。 jps至關於Solaris進程工具ps。不象"pgrep java"或"ps -ef grep java",jps並不使用應用程序名來查找JVM實例。所以,它查找全部的Java應用程序,包括即便沒有使用java執行體的那種(例如,定製的啓動 器)。另外,jps僅查找當前用戶的Java進程,而不是當前系統中的全部進程。java
咱們知道,不少Java命令都在jdk的JAVA_HOME/bin/目錄下面,jps也不例外,他就在bin目錄下,因此,他是java自帶的一個命令。linux
jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一個顯示當前全部java進程pid的命令,簡單實用,很是適合在linux/unix平臺上簡單察看當前java進程的一些簡單狀況。web
jdk中的jps命令能夠顯示當前運行的java進程以及相關參數,它的實現機制以下: java程序在啓動之後,會在java.io.tmpdir
指定的目錄下,就是臨時文件夾裏,生成一個相似於hsperfdata_User
的文件夾,這個文件夾裏(在Linux中爲/tmp/hsperfdata_{userName}/),有幾個文件,名字就是java進程的pid,所以列出當前運行的java進程,只是把這個目錄裏的文件名列一下而已。 至於系統的參數什麼,就能夠解析這幾個文件得到。ubuntu
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驗證一下:tomcat
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命令,也要開一個進程)app
想要學習一個命令,先來看看幫助,使用jps -help
查看幫助:eclipse
hollis@hos:/tmp/hsperfdata_hollis$ jps -help usage: jps [-help] jps [-q] [-mlvV] [<hostid>] Definitions: <hostid>: <hostname>[:<port>]
接下來,爲了詳細介紹這些參數,咱們編寫幾個類,在main方法裏寫一個while(true)的循環,查看java進程狀況。代碼以下:jvm
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 方法的參數jsp
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-8
PS:jps命令有個地方很很差,彷佛只能顯示當前用戶的java進程,要顯示其餘用戶的仍是隻能用unix/linux的ps命令。
jps是我最經常使用的java命令。使用jps能夠查看當前有哪些Java進程處於運行狀態。若是我運行了一個web應用(使用tomcat、jboss、jetty等啓動)的時候,我就可使用jps查看啓動狀況。有的時候我想知道這個應用的日誌會輸出到哪裏,或者啓動的時候使用了哪些javaagent,那麼我可使用
jps -v
查看進程的jvm參數狀況。
現象: 用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目錄保存進程信息,但因爲以上一、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開頭)