溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中的jdk命令行工具有哪些

發(fā)布時(shí)間:2021-09-27 09:42:42 來源:億速云 閱讀:155 作者:柒染 欄目:編程語言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Java中的jdk命令行工具有哪些,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1. 查看java進(jìn)程—— jps 命令

jps 命令類似于linux下的ps命令,但它只用于列出java的進(jìn)程。

首先使用ps命令看下java進(jìn)程:

$ ps aux | grep java
root      5601  0.1 22.4 3715428 869352 ?      Sl   9月23  87:36 java -jar -Dspring.profiles.active=prod -Dserver.port=8080 -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -Xmn512m -Xss512k -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -verbose:gc -XX:+PrintGCDetails -XX:+DisableExplicitGC -Xloggc:/opt/app/ruoyi-admin/logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/app/ruoyi-admin/logs/dump.logs ruoyi-admin.jar
root     30418  0.0  0.0 112728   968 pts/0    S+   21:56   0:00 grep --color=auto java
1.1 jps 命令不加任何參數(shù),可以列出java進(jìn)程id及main函數(shù)名稱:
$ jps
5601 jar
30536 Jps
1.2 參數(shù) -q 可以指定jps只輸出進(jìn)程id:
$ jps -q
5601
30604
1.3 參數(shù) -m 可以用于輸出傳遞給java進(jìn)程(主函數(shù))的參數(shù)
jps -m
5601 jar
30682 Jps -m
1.4 參數(shù) -l 可以用于輸出主函數(shù)的完整路徑
$ jps -l
5601 ruoyi-admin.jar
30868 sun.tools.jps.Jps
1.5 參數(shù) -v 可以顯示傳遞java虛擬機(jī)的參數(shù)
5601 jar -Dspring.profiles.active=prod -Dserver.port=8080 -Dfile.encoding=UTF-8 -Xms1024m -Xmx1024m -Xmn512m -Xss512k -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -verbose:gc -XX:+PrintGCDetails -XX:+DisableExplicitGC -Xloggc:/opt/app/ruoyi-admin/logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/app/ruoyi-admin/logs/dump.logs
31035 Jps -Denv.class.path=.:/usr/local/java/jdk1.8.0_221/lib:/usr/local/java/jdk1.8.0_221/jre/lib -Dapplication.home=/usr/local/java/jdk1.8.0_221 -Xms8m

2. 查看虛擬機(jī)運(yùn)行時(shí)信息—— jstat 命令

jstat 命令是一個(gè)可以用于觀察java應(yīng)用程序運(yùn)行時(shí)相關(guān)信息的工具,它的功能非常強(qiáng)大,可以通過它查看堆信息的詳細(xì)情況,基本語法如下:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
  • option 可以由以下值構(gòu)成:

    • class:顯示ClassLoad的相關(guān)信息;

    • compiler:顯示JIT編譯的相關(guān)信息;

    • gc:顯示和gc相關(guān)的堆信息;

    • gccapacity:顯示各個(gè)代的容量以及使用情況;

    • gccause:顯示垃圾回收的相關(guān)信息(通-gcutil, 同時(shí)顯示最后一次或當(dāng)前正在發(fā)生的垃圾回收的誘因;

    • gcmetacapacity:顯示metaspace的大小

    • gcnew:顯示新生代信息;

    • gcnewcapacity:顯示新生代大小和使用情況;

    • gcold:顯示老年代和永久代的信息;

    • gcoldcapacity:顯示老年代的大??;

    • gcutil:顯示垃圾收集信息;

    • printcompilation:輸出JIT編譯的方法信息

  • -t 參數(shù)可以在輸出信息前加上一個(gè)Timestamp列,顯示程序的運(yùn)行時(shí)間

  • -h 參數(shù)可以指定在周期性輸出時(shí),輸出多少行數(shù)據(jù)后輸出一個(gè)表頭信息

  • interval 參數(shù)用于指定輸出統(tǒng)計(jì)數(shù)據(jù)的周期,單位為毫秒

  • count 參數(shù)用于指定一共輸出多少次數(shù)據(jù)。

例1:輸出進(jìn)程的classLoader相關(guān)信息
$ jstat -class -t 5601 1000 2
Timestamp       Loaded  Bytes  Unloaded  Bytes     Time
      3127495.0  14324 27006.2        0     0.0       7.19
      3127496.2  14324 27006.2        0     0.0       7.19

-class的輸出中,

  • Loaded表示載入類的數(shù)量,

  • Bytes表示載入類的合計(jì)大小,

  • Unloaded表示卸載類的數(shù)量,

  • 第2個(gè)Bytes表示卸載類的大小,

  • Time表示在加載和卸載類上所花的時(shí)間。

例2:查看 JIT 編譯的信息
$ jstat -compiler -t 5601
Timestamp       Compiled Failed Invalid   Time   FailedType FailedMethod
      3127815.7    19402      0       0    65.39          0
  • Compiled:編譯任務(wù)執(zhí)行的次數(shù)

  • Failed:編譯失敗的次數(shù)

  • Invalid:編譯不可用的次數(shù)

  • Time:編譯的總耗時(shí)

  • FailedType:最后一次編譯失敗的類型

  • FailedMethod:最后一次編譯失敗的類名和方法名

例3:顯示與gc相關(guān)的堆信息
$ jstat -gc 5601
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
52416.0 52416.0 353.4   0.0   419456.0 56842.5   524288.0   64566.9   88160.0 84466.4 10452.0 9748.5    254    2.182   4      0.157    2.339
  • S0C:s0區(qū)的大小(KB)

  • S1C:s1區(qū)的大小(KB)

  • S0U:s0區(qū)的使用大小(KB)

  • S1U:s1區(qū)的使用大小(KB)

  • EC:eden區(qū)的大小(KB)

  • EU:eden區(qū)的使用大小(KB)

  • OC:老年代大小(KB)

  • OU:老年代使用大小(KB)

  • MC:元數(shù)據(jù)區(qū)(Metaspace)大小(KB)

  • MU:元數(shù)據(jù)區(qū)(Metaspace)使用大小(KB)

  • CCSC:壓縮類空間大小(KB)

  • CCSU:壓縮類空間使用大小(KB)

  • YGC:年輕代垃圾回收次數(shù)

  • YGCT:年輕代垃圾回收消耗時(shí)間

  • FGC:老年代垃圾回收次數(shù)

  • FGCT:老年代垃圾回收消耗時(shí)間

  • GCT:垃圾回收消耗總時(shí)間

例4:顯示與gc相關(guān)的堆信息,包含各代的最大值與最小值
$ jstat -gccapacity 5601
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
524288.0 524288.0 524288.0 52416.0 52416.0 419456.0   524288.0   524288.0   524288.0   524288.0      0.0 1126400.0  88160.0      0.0 1048576.0  10452.0    254     4
  • NGCMN:新生代最小容量(KB)

  • NGCMX:新生代最大容量(KB)

  • NGC:當(dāng)前新生代容量(KB)

  • S0C:第一個(gè)幸存區(qū)大小(KB)

  • S1C:第二個(gè)幸存區(qū)的大小(KB)

  • EC:伊甸園區(qū)的大小(KB)

  • OGCMN:老年代最小容量(KB)

  • OGCMX:老年代最大容量(KB)

  • OGC:當(dāng)前老年代大小(KB)

  • OC:當(dāng)前老年代大小(KB)

  • MCMN:最小元數(shù)據(jù)容量(KB)

  • MCMX:最大元數(shù)據(jù)容量(KB)

  • MC:當(dāng)前元數(shù)據(jù)空間大小(KB)

  • CCSMN:最小壓縮類空間大小(KB)

  • CCSMX:最大壓縮類空間大小(KB)

  • CCSC:當(dāng)前壓縮類空間大小(KB)

  • YGC:年輕代gc次數(shù)

  • FGC:老年代GC次數(shù)

說明:與 -gc 相比,-gccapacity 不僅輸出了各個(gè)代的當(dāng)前大小,也包含了各個(gè)代的最大值和最小值

例5:顯示最近一次gc的原因以及當(dāng)前gc的原因
$ jstat -gccause 5601
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC
  0.67   0.00  19.75  12.32  95.81  93.27    254    2.182     4    0.157    2.339 Allocation Failure   No GC
  • LGCC:上次gc的原因

  • GCC:當(dāng)前gc的原因

本例中,最近一次gc是由于內(nèi)存分配失敗引起的,當(dāng)前時(shí)刻未進(jìn)行g(shù)c.

例6:查看新生代的一些詳細(xì)信息
$ jstat -gcnew 5601
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
52416.0 52416.0  353.4    0.0  6   6 26208.0 419456.0 103801.7    254    2.182
  • TT:新生代對(duì)象晉升到老年代對(duì)象的年齡

  • MTT:新生代對(duì)象晉升到老年代對(duì)象的年齡最大值

  • DSS:所需的survivor區(qū)大小

例7:詳細(xì)輸出新生代各個(gè)區(qū)的大小信息
$ jstat -gcnewcapacity 5601
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
  524288.0   524288.0   524288.0  52416.0  52416.0  52416.0  52416.0   419456.0   419456.0   254     4
  • NGCMN:新生代最小容量

  • NGCMX:新生代最大容量

  • NGC:當(dāng)前新生代容量

  • S0CMX:s0區(qū)的最大值(KB)

  • S0C:當(dāng)前s0區(qū)大小(KB)

  • S1CMX:s1區(qū)的最大值(KB)

  • S1C:當(dāng)前s1區(qū)大小(KB)

  • ECMX:eden區(qū)最大值(KB)

  • EC:當(dāng)前eden大小

  • YGC:年輕代垃圾回收次數(shù)

  • FGC:老年代回收次數(shù)

例8:輸出老年代gc的概況
$ jstat -gcold 5601
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT
 88160.0  84466.4  10452.0   9748.5    524288.0     64566.9    254     4    0.157    2.339
例8:輸出老年代的容量信息
$ jstat -gcoldcapacity 5601
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT
   524288.0    524288.0    524288.0    524288.0   254     4    0.157    2.339
例9:輸出gc回收相關(guān)信息
$ jstat -gcutil 5601
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.67   0.00  53.27  12.32  95.81  93.27    254    2.182     4    0.157    2.339
  • S0:s0區(qū)當(dāng)前使用比例

  • S1:s1區(qū)當(dāng)前使用比例

  • E:eden區(qū)使用比例

  • O:老年代使用比例

  • M:元數(shù)據(jù)區(qū)使用比例

  • CCS:壓縮使用比例

  • YGC:年輕代垃圾回收次數(shù)

  • FGC:老年代垃圾回收次數(shù)

  • FGCT:老年代垃圾回收消耗時(shí)間

  • GCT:垃圾回收消耗總時(shí)間

例10:連續(xù)查看gc回收信息

jstat 結(jié)合 intervalcount 參數(shù),可以持續(xù)觀察堆使用情況及gc信息,如:

# 間隔1000ms輸出gc回收信息,共輸出5次
jstat -gcutil 5601 1000 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.67   0.00  55.27  12.32  95.81  93.27    254    2.182     4    0.157    2.339
  0.67   0.00  55.27  12.32  95.81  93.27    254    2.182     4    0.157    2.339
  0.67   0.00  55.28  12.32  95.81  93.27    254    2.182     4    0.157    2.339
  0.67   0.00  55.28  12.32  95.81  93.27    254    2.182     4    0.157    2.339
  0.67   0.00  55.28  12.32  95.81  93.27    254    2.182     4    0.157    2.339

同樣地,上述其他示例也有類似的用法。

3. 查看虛擬機(jī)參數(shù)—— jinfo 命令

jinfo 命令可以用來查看正在運(yùn)行的java應(yīng)用程序的擴(kuò)展參數(shù),基本語法如下:

jinfo <option> <pid>

其中option可以為以下參數(shù):

  • -flag<name>:打印指定java虛擬機(jī)的參數(shù)值

在很多情況下,java應(yīng)用程序不會(huì)指定所有的java虛擬機(jī)參數(shù)。而此時(shí),開發(fā)人員可能不知道某一個(gè)具體的java虛擬機(jī)參數(shù)的認(rèn)。在這種情況下,可以使用 jinfo 命令,開發(fā)人員可以很方便地找到j(luò)ava虛擬機(jī)參數(shù)的當(dāng)前值。

例:查看新生代對(duì)象晉升到老年代的最大年齡:
$ jinfo -flag MaxTenuringThreshold 5601
-XX:MaxTenuringThreshold=6

4. 導(dǎo)出堆到文件—— jmap 命令

jmap命令是一個(gè)多功能的命令,它可以生成java程序的堆dump文件,也可以查看堆內(nèi)對(duì)象實(shí)例的統(tǒng)計(jì)信息、查看classLoader的信息以及finalizer隊(duì)列。

例1:生成對(duì)象的統(tǒng)計(jì)信息
$ jmap -histo 5601
num     #instances         #bytes  class name
----------------------------------------------
   1:        319862       32778488  [C
   2:         50830       19345024  [I
   3:        120919       10764840  [B
   4:        201841        8073640  java.util.TreeMap$Entry
   5:        253189        6076536  java.lang.String
   6:         46302        4074576  java.lang.reflect.Method
   7:         90594        2899008  java.util.concurrent.ConcurrentHashMap$Node
   8:         61733        2806752  [Ljava.lang.Object;
   9:         50356        2014240  java.util.LinkedHashMap$Entry
  10:         27163        1987056  [Ljava.util.HashMap$Node;
  11:         15304        1710560  java.lang.Class
  12:         40517        1296544  java.util.HashMap$Node
  13:         23026        1105248  org.aspectj.weaver.reflect.ShadowMatchImpl
  14:         19402        1086512  java.util.LinkedHashMap
  15:         20779         997392  java.util.HashMap
  16:         11205         986040  com.ruoyi.framework.shiro.session.OnlineSession
  17:         29536         945152  com.mysql.cj.util.LazyString
  18:          4046         938672  com.mysql.cj.jdbc.result.ResultSetImpl
  19:         39886         893584  [Ljava.lang.Class;
  20:         11264         811008  net.sf.ehcache.Element
  21:         15705         753840  java.nio.HeapByteBuffer
··· 省略其他輸出

注:-histo 輸出內(nèi)容較多,建議將內(nèi)容輸出到文件中。

例2:導(dǎo)出java程序的當(dāng)前堆快照
$ jmap -dump:format=b,file=/home/www/heap.dump 5601
Dumping heap to /home/www/heap.dump ...
Heap dump file created

導(dǎo)出堆文件后,可以使用Visual VMMAT等工具分析。

例3:查看系統(tǒng)的ClassLoader信息
jmap -clstats 5601
Attaching to process ID 5601, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11
finding class loader instances ..
done.
computing per loader stat ..done.
please wait.. computing liveness.liveness analysis may be inaccurate ...
class_loader	classes	bytes	parent_loader	alive?	type

<bootstrap>	3538	6193214	  null  	live	<internal>
0x00000000e3ba0bb8	1	880	0x00000000e0020830	dead	sun/reflect/DelegatingClassLoader@0x000000010000a0a0
0x00000000e3d273d0	1	1474	0x00000000e0020830	dead	sun/reflect/DelegatingClassLoader@0x000000010000a0a0
0x00000000e15b3158	1	1473	  null  	dead	sun/reflect/DelegatingClassLoader@0x000000010000a0a0
0x00000000e3062f00	1	880	0x00000000e0020830	dead	sun/reflect/DelegatingClassLoader@0x000000010000a0a0
0x00000000e35eff58	1	1471	0x00000000e0020830	dead	sun/reflect/DelegatingClassLoader@0x000000010000a0a0
0x00000000e068b460	1	1473	0x00000000e0020830	dead	sun/reflect/DelegatingClassLoader@0x000000010000a0a0
0x00000000e2e04ee8	1	1473	0x00000000e0020830	dead	sun/reflect/DelegatingClassLoader@0x000000010000a0a0
0x00000000e339ef30	1	880	0x00000000e0020830	dead	sun/reflect/DelegatingClassLoader@0x000000010000a0a0
0x00000000e33a1330	1	1473	0x00000000e0020830	dead	sun/reflect/DelegatingClassLoader@0x000000010000a0a0
0x00000000e3575358	1	1471	  null  	dead	sun/reflect/DelegatingClassLoader@0x000000010000a0a0
···省略其他輸出

total = 569	13668	22579616	    N/A    	alive=1, dead=568	    N/A
例4:查看系統(tǒng)的finalizer隊(duì)列中的對(duì)象:
$ jmap -finalizerinfo 5601
Attaching to process ID 5601, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11
Number of objects pending for finalization: 0

5. 查看線程堆?!?code>jstack命令

jstack命令用于導(dǎo)出java應(yīng)用程序的線程堆棧,語法為:

jstack [-l] <pid>
  • -l 用于打印鎖的附加信息。

jstack命令會(huì)在控制臺(tái)輸出程序中的所有的鎖信息,可以使用重定向?qū)⑤敵鰞?nèi)容保存到文件中,如:

jstack -l 5601 > ./thread.log

6. 多功能命令行 jcmd 命令

在jdk1.7后,新增了一個(gè)命令行工具 jcmd。它是一個(gè)多功能的工具,可以用來導(dǎo)出堆、查看java進(jìn)程、導(dǎo)出線程信息、執(zhí)行GC等。

例1:列出所有的java進(jìn)程
$ jcmd -l
5601 ruoyi-admin.jar
1852 sun.tools.jcmd.JCmd -l
例2:查看虛擬機(jī)運(yùn)行時(shí)長(zhǎng) VM.uptime
jcmd 5601 VM.uptime
5601:
3301407.004 s
例3:打印線程棧信息(同jstack
$ jcmd 5601 Thread.print
5601:
2019-10-31 22:17:31
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.221-b11 mixed mode):

"Attach Listener" #167 daemon prio=9 os_prio=0 tid=0x00007fcc1001b000 nid=0x5ea0 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
... 省略其他輸出
例4:查看系統(tǒng)中類的統(tǒng)計(jì)信息
jcmd 5601 GC.class_histogram
5601:

 num     #instances         #bytes  class name
----------------------------------------------
   1:        128273       14782000  [C
   2:         34256        3014528  java.lang.reflect.Method
   3:        122377        2937048  java.lang.String
   4:         88955        2846560  java.util.concurrent.ConcurrentHashMap$Node
   5:          7481        2524736  [B
   6:         15102        1689552  java.lang.Class
   7:         34360        1374400  java.util.LinkedHashMap$Entry
... 省略其他輸出
例5:導(dǎo)出堆信息
$ jcmd 5601 GC.heap_dump ~/dump.log
5601:
Heap dump file created

GC.heap_dump 接收一個(gè)參數(shù)作為堆Dump文件的輸出路徑,得到堆文件后,可以使用MAT或VisualVm等工具進(jìn)行分析。

例6:獲取系統(tǒng)的properties內(nèi)容
$ jcmd 5601 VM.system_properties
5601:
#Thu Oct 31 22:25:10 CST 2019
java.runtime.name=Java(TM) SE Runtime Environment
java.protocol.handler.pkgs=org.springframework.boot.loader
sun.boot.library.path=/usr/local/java/jdk1.8.0_221/jre/lib/amd64
java.vm.version=25.221-b11
java.vm.vendor=Oracle Corporation
java.vendor.url=http\://java.oracle.com/
... 省略其他輸出
例7:獲得啟動(dòng)參數(shù)
$ jcmd 5601 VM.flags
5601:
-XX:CICompilerCount=2 -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/app/ruoyi-admin/logs/dump.logs -XX:InitialHeapSize=1073741824 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=536870912 -XX:MaxTenuringThreshold=6 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=536870912 -XX:OldPLABSize=16 -XX:OldSize=536870912 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:ThreadStackSize=512 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
例8:獲得所有性能統(tǒng)計(jì)相關(guān)數(shù)據(jù)
$ jcmd 5601 PerfCounter.print
5601:
java.ci.totalTime=66922617199
java.cls.loadedClasses=14326
java.cls.sharedLoadedClasses=0
java.cls.sharedUnloadedClasses=0
java.cls.unloadedClasses=203
java.property.java.class.path="ruoyi-admin.jar"
java.property.java.endorsed.dirs="/usr/local/java/jdk1.8.0_221/jre/lib/endorsed"
java.property.java.ext.dirs="/usr/local/java/jdk1.8.0_221/jre/lib/ext:/usr/java/packages/lib/ext"
java.property.java.home="/usr/local/java/jdk1.8.0_221/jre"
java.property.java.library.path="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"
java.property.java.version="1.8.0_221"
... 省略其他輸出

在這個(gè)輸出中,可以找到所有的性能統(tǒng)計(jì)相關(guān)的數(shù)據(jù),如活動(dòng)的線程數(shù)、活動(dòng)線程峰值等信息。


上述就是小編為大家分享的Java中的jdk命令行工具有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI