必知必会Java
你好,我是阿光。
最近想著把工作中使用過的java命令都梳理一下,方便日后查閱。雖然這類文章很多,但自己梳理總結(jié)后,還是會(huì)有一些新的收獲。這也是這篇筆記的由來。
今天先聊聊 jps 命令。
命令概述?
jps命令是JDK提供的一個(gè)工具,用于查看目標(biāo)系統(tǒng)上的Java進(jìn)程基本信息(進(jìn)程ID, 啟動(dòng)類,啟動(dòng)參數(shù)等)。命令在JDK安裝目錄的bin目錄下,比如在我的window下D:\Java\jdk1.8.0\bin\jps.exe。但JRE沒有提供這個(gè)命令。不過從Java9模塊化開始,已經(jīng)不區(qū)分JDK和JRE了。
這個(gè)命令只會(huì)檢測(cè)到目標(biāo)系統(tǒng)上HotSpot版本的,具有訪問權(quán)限的JVM信息。
命令的官方文檔可查看這個(gè)地址The jps Command (oracle.com)
命令用法?
我的演示環(huán)境是在window11, jdk17版本下
我們可以通過jps -h 或者 jps --help 或者 jps -help查看這個(gè)命令的基本用法:
jps --help
usage: jps [--help]
jps [-q] [-mlvV] [<hostid>]
Definitions:
<hostid>: <hostname>[:<port>]
-? -h --help -help: Print this help message and exit.
中括號(hào)里的選項(xiàng)都是可選的,最簡(jiǎn)單的就是jps:
jps
35936 Jps
1076 RemoteMavenServer36
這里沒有指定主機(jī),所以只會(huì)查找本地主機(jī)上的JVM。第一列是進(jìn)程ID,第二列是啟動(dòng)類名。可以看到,jps命令本身也是一個(gè)Java進(jìn)程,它的啟動(dòng)類是Jps。
-q選項(xiàng)會(huì)讓命令只輸出進(jìn)程ID,如下:
jps -q
35936
1076
-mlvV選項(xiàng)可以任意指定一個(gè),也可以同時(shí)指定多個(gè),它們可以隨意組合。
-
-m選項(xiàng)會(huì)顯示傳遞給main方法的參數(shù),即程序自定義的一些參數(shù)。 -
-l選項(xiàng)會(huì)顯示啟動(dòng)類的完整包名稱或者啟動(dòng)JAR的完整路徑名。 -
-v選項(xiàng)會(huì)顯示傳遞給虛擬機(jī)的參數(shù),比如-Dxxx=v形式指定的參數(shù),-Xms128M參數(shù)等。 -
-V大V選項(xiàng)只會(huì)輸出PID和類名,jps和jps -V的輸出是一樣的。
這里我本地運(yùn)行了一個(gè)Java進(jìn)程,啟動(dòng)類是Main,并且指定了一些自定義的參數(shù).
- 列出main方法參數(shù):jps -m
jps -m
16596 Main test=11 測(cè)試參數(shù):a
18796 Jps -m
- 列出啟動(dòng)類全名:jps -l
jps -l
16596 com.ggy.softman.Main
11836 jdk.jcmd/sun.tools.jps.Jps
- 列出虛擬機(jī)參數(shù):jps -v
jps -v
29716 Main -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8
11388 Jps -Dapplication.home=D:\Java\jdk-17.0.6.10 -Xms8m -Djdk.module.main=jdk.jcmd
- 組合命令,輸出信息更豐富:jps -lmv
jps -lmv
31948 com.ggy.softman.Main test=11 測(cè)試參數(shù):a -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8
29008 jdk.jcmd/sun.tools.jps.Jps -lmv -Dapplication.home=D:\Java\jdk-17.0.6.10 -Xms8m -Djdk.module.main=jdk.jcmd
該命令也可以顯示遠(yuǎn)程主機(jī)的Java進(jìn)程信息,只要在命令的最后帶上hostid。這種情況基本使用很少,這里也沒演示了,可以查看官網(wǎng)文檔。
連接遠(yuǎn)程主機(jī)時(shí),遠(yuǎn)程主機(jī)上必須運(yùn)行
jstatd命令。
使用場(chǎng)景??
這里我總結(jié)了一下日常開發(fā)中,使用到該命令的場(chǎng)景。
- 有時(shí)候需要登錄到服務(wù)器上排查一些問題,查看服務(wù)日志,但不太清楚程序部署在哪個(gè)目錄下,這時(shí)候我會(huì)通過
jps -lv | grep xxx查詢指定名的程序,一般在輸出里會(huì)顯示一些目錄信息。 - 快速查看Java服務(wù)是否正常,PID是什么,然后結(jié)合其他命令使用。
- 有些情況下,快速查看下Java服務(wù)的參數(shù)是否配置正確。
常見問題?
這里我總結(jié)了一下該命令經(jīng)常會(huì)遇到的一些問題。
- command not found
出現(xiàn)這個(gè)報(bào)錯(cuò),一般有兩種情況,一是沒有配置好JAVA_HOME環(huán)境變量,二是安裝的是JRE,沒有帶jps命令。
還有種情況是使用的JDK版本低于1.5。
- 命令執(zhí)行后沒有任何輸出,或者ps命令顯示有Java進(jìn)程,但jps命令沒有顯示該進(jìn)程。
出現(xiàn)這種情況,可以按以下步驟排查:
a. Java服務(wù)和jps命令是否是在同一個(gè)用戶下運(yùn)行的;
b. {tmpdir}/hsperfdata_{user_name}/目錄下是否有文件。tmpdir是系統(tǒng)臨時(shí)目錄。
window一般是:
C:\Users\user_name\AppData\Local\Temp\linux一般是:
/tmp如果當(dāng)前用戶沒有該臨時(shí)目錄的讀取權(quán)限,jps命令也會(huì)失效。
有時(shí)候linux系統(tǒng)會(huì)定時(shí)清理臨時(shí)目錄,也會(huì)導(dǎo)致該目錄為空。
jps命令其實(shí)是用Java實(shí)現(xiàn)的,原理就是通過掃描{tmpdir}/hsperfdata_{user_name}/目錄下的進(jìn)程文件。每個(gè)Java進(jìn)程啟動(dòng)時(shí),都會(huì)在該目錄下生成一個(gè)以PID命名的文件。下面是我window下的:
每個(gè)進(jìn)程文件里都記錄了該虛擬機(jī)進(jìn)程的很多信息。基本上很多Java命令都是從這個(gè)文件里獲取一些信息的。下面是文件的部分內(nèi)容:
很多Java命令都可以看到源碼,Java1.8及以下版本是在lib/tools.jar里,1.8以上版本移到了多個(gè)模塊下,jps、jstack、jinfo等基本命令是在jmods/jdk.jcmd.jmod里,還有一些是在獨(dú)立的模塊下,比如jdk.jlink.jmod。
有時(shí)遇到一些奇怪的異常時(shí),可以使用
jps -J-Djps.debug=true -J-Djps.printStackTrace=true命令,可以獲取到j(luò)ps命令的詳細(xì)錯(cuò)誤信息。
jps命令就是這些了,下次jstack再見。
參考資料??
- The jps Command (oracle.com)
總結(jié)
- 上一篇: PHP如何开启慢日志查询
- 下一篇: java美元兑换,(Java实现) 美元