《深入理解Java虛擬機》之java工具-jps

 原文鏈接 :Java命令學習系列(一)——Jps

最近準備研究一下虛擬機,做以下筆記,原文鏈接在上面,如要閱讀請點擊上面的鏈接,給原文作者更多支持

 

jps(java process status)
	-l 顯示全包名
	-v 顯示虛擬機參數
	-m 運行時參入主類的參數

 

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-8

PS: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開頭)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章