日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

必知必会Java

發(fā)布時(shí)間:2023/12/24 java 39 coder
生活随笔 收集整理的這篇文章主要介紹了 必知必会Java 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

你好,我是阿光。

最近想著把工作中使用過的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和類名,jpsjps -V的輸出是一樣的。

這里我本地運(yùn)行了一個(gè)Java進(jìn)程,啟動(dòng)類是Main,并且指定了一些自定義的參數(shù).

  1. 列出main方法參數(shù):jps -m
jps -m
16596 Main test=11 測(cè)試參數(shù):a
18796 Jps -m
  1. 列出啟動(dòng)類全名:jps -l
jps -l
16596 com.ggy.softman.Main
11836 jdk.jcmd/sun.tools.jps.Jps
  1. 列出虛擬機(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
  1. 組合命令,輸出信息更豐富: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)景。

  1. 有時(shí)候需要登錄到服務(wù)器上排查一些問題,查看服務(wù)日志,但不太清楚程序部署在哪個(gè)目錄下,這時(shí)候我會(huì)通過jps -lv | grep xxx 查詢指定名的程序,一般在輸出里會(huì)顯示一些目錄信息。
  2. 快速查看Java服務(wù)是否正常,PID是什么,然后結(jié)合其他命令使用。
  3. 有些情況下,快速查看下Java服務(wù)的參數(shù)是否配置正確。

常見問題?

這里我總結(jié)了一下該命令經(jīng)常會(huì)遇到的一些問題。

  1. command not found

出現(xiàn)這個(gè)報(bào)錯(cuò),一般有兩種情況,一是沒有配置好JAVA_HOME環(huán)境變量,二是安裝的是JRE,沒有帶jps命令。

還有種情況是使用的JDK版本低于1.5。

  1. 命令執(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再見。

參考資料??

  1. The jps Command (oracle.com)

總結(jié)

以上是生活随笔為你收集整理的必知必会Java的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。