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

发布时间:2021-09-27 17:50 来源:亿速云 阅读:0 作者:柒染 栏目: 开发技术

这期内容当中小编将会给大家带来有关Java中的jdk命令行工具有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1. 查看java进程—— jps 命令

jps 命令类似于linux下的ps命令,但它只用于列出java的进程。

首先使用ps命令看下java进程:

$ 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 命令不加任何参数,可以列出java进程id及main函数名称:
$ jps
5601 jar
30536 Jps
1.2 参数 -q 可以指定jps只输出进程id:
$ jps -q
5601
30604
1.3 参数 -m 可以用于输出传递给java进程(主函数)的参数
jps -m
5601 jar
30682 Jps -m
1.4 参数 -l 可以用于输出主函数的完整路径
$ jps -l
5601 ruoyi-admin.jar
30868 sun.tools.jps.Jps
1.5 参数 -v 可以显示传递java虚拟机的参数
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. 查看虚拟机运行时信息—— jstat 命令

jstat 命令是一个可以用于观察java应用程序运行时相关信息的工具,它的功能非常强大,可以通过它查看堆信息的详细情况,基本语法如下:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
  • option 可以由以下值构成:

    • class:显示ClassLoad的相关信息;

    • compiler:显示JIT编译的相关信息;

    • gc:显示和gc相关的堆信息;

    • gccapacity:显示各个代的容量以及使用情况;

    • gccause:显示垃圾回收的相关信息(通-gcutil, 同时显示最后一次或当前正在发生的垃圾回收的诱因;

    • gcmetacapacity:显示metaspace的大小

    • gcnew:显示新生代信息;

    • gcnewcapacity:显示新生代大小和使用情况;

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

    • gcoldcapacity:显示老年代的大小;

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

    • printcompilation:输出JIT编译的方法信息

  • -t 参数可以在输出信息前加上一个Timestamp列,显示程序的运行时间

  • -h 参数可以指定在周期性输出时,输出多少行数据后输出一个表头信息

  • interval 参数用于指定输出统计数据的周期,单位为毫秒

  • count 参数用于指定一共输出多少次数据。

例1:输出进程的classLoader相关信息
$ 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表示载入类的数量,

  • Bytes表示载入类的合计大小,

  • Unloaded表示卸载类的数量,

  • 第2个Bytes表示卸载类的大小,

  • Time表示在加载和卸载类上所花的时间。

例2:查看 JIT 编译的信息
$ jstat -compiler -t 5601
Timestamp       Compiled Failed Invalid   Time   FailedType FailedMethod
      3127815.7    19402      0       0    65.39          0
  • Compiled:编译任务执行的次数

  • Failed:编译失败的次数

  • Invalid:编译不可用的次数

  • Time:编译的总耗时

  • FailedType:最后一次编译失败的类型

  • FailedMethod:最后一次编译失败的类名和方法名

例3:显示与gc相关的堆信息
$ 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区的大小(KB)

  • S1C:s1区的大小(KB)

  • S0U:s0区的使用大小(KB)

  • S1U:s1区的使用大小(KB)

  • EC:eden区的大小(KB)

  • EU:eden区的使用大小(KB)

  • OC:老年代大小(KB)

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

  • MC:元数据区(Metaspace)大小(KB)

  • MU:元数据区(Metaspace)使用大小(KB)

  • CCSC:压缩类空间大小(KB)

  • CCSU:压缩类空间使用大小(KB)

  • YGC:年轻代垃圾回收次数

  • YGCT:年轻代垃圾回收消耗时间

  • FGC:老年代垃圾回收次数

  • FGCT:老年代垃圾回收消耗时间

  • GCT:垃圾回收消耗总时间

例4:显示与gc相关的堆信息,包含各代的最大值与最小值
$ 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:当前新生代容量(KB)

  • S0C:第一个幸存区大小(KB)

  • S1C:第二个幸存区的大小(KB)

  • EC:伊甸园区的大小(KB)

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

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

  • OGC:当前老年代大小(KB)

  • OC:当前老年代大小(KB)

  • MCMN:最小元数据容量(KB)

  • MCMX:最大元数据容量(KB)

  • MC:当前元数据空间大小(KB)

  • CCSMN:最小压缩类空间大小(KB)

  • CCSMX:最大压缩类空间大小(KB)

  • CCSC:当前压缩类空间大小(KB)

  • YGC:年轻代gc次数

  • FGC:老年代GC次数

说明:与 -gc 相比,-gccapacity 不仅输出了各个代的当前大小,也包含了各个代的最大值和最小值

例5:显示最近一次gc的原因以及当前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:当前gc的原因

本例中,最近一次gc是由于内存分配失败引起的,当前时刻未进行gc.

例6:查看新生代的一些详细信息
$ 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:新生代对象晋升到老年代对象的年龄

  • MTT:新生代对象晋升到老年代对象的年龄最大值

  • DSS:所需的survivor区大小

例7:详细输出新生代各个区的大小信息
$ 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:当前新生代容量

  • S0CMX:s0区的最大值(KB)

  • S0C:当前s0区大小(KB)

  • S1CMX:s1区的最大值(KB)

  • S1C:当前s1区大小(KB)

  • ECMX:eden区最大值(KB)

  • EC:当前eden大小

  • YGC:年轻代垃圾回收次数

  • FGC:老年代回收次数

例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回收相关信息
$ 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区当前使用比例

  • S1:s1区当前使用比例

  • E:eden区使用比例

  • O:老年代使用比例

  • M:元数据区使用比例

  • CCS:压缩使用比例

  • YGC:年轻代垃圾回收次数

  • FGC:老年代垃圾回收次数

  • FGCT:老年代垃圾回收消耗时间

  • GCT:垃圾回收消耗总时间

例10:连续查看gc回收信息

jstat 结合 intervalcount 参数,可以持续观察堆使用情况及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. 查看虚拟机参数—— jinfo 命令

jinfo 命令可以用来查看正在运行的java应用程序的扩展参数,基本语法如下:

jinfo <option> <pid>

其中option可以为以下参数:

  • -flag<name>:打印指定java虚拟机的参数值

在很多情况下,java应用程序不会指定所有的java虚拟机参数。而此时,开发人员可能不知道某一个具体的java虚拟机参数的认。在这种情况下,可以使用 jinfo 命令,开发人员可以很方便地找到java虚拟机参数的当前值。

例:查看新生代对象晋升到老年代的最大年龄:
$ jinfo -flag MaxTenuringThreshold 5601
-XX:MaxTenuringThreshold=6

4. 导出堆到文件—— jmap 命令

jmap命令是一个多功能的命令,它可以生成java程序的堆dump文件,也可以查看堆内对象实例的统计信息、查看classLoader的信息以及finalizer队列。

例1:生成对象的统计信息
$ 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..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 输出内容较多,建议将内容输出到文件中。

例2:导出java程序的当前堆快照
$ jmap -dump:format=b,file=/home/www/heap.dump 5601
Dumping heap to /home/www/heap.dump ...
Heap dump file created

导出堆文件后,可以使用Visual VMMAT等工具分析。

例3:查看系统的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:查看系统的finalizer队列中的对象:
$ 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. 查看线程堆栈——jstack命令

jstack命令用于导出java应用程序的线程堆栈,语法为:

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

jstack命令会在控制台输出程序中的所有的锁信息,可以使用重定向将输出内容保存到文件中,如:

jstack -l 5601 > ./thread.log

6. 多功能命令行 jcmd 命令

在jdk1.7后,新增了一个命令行工具 jcmd。它是一个多功能的工具,可以用来导出堆、查看java进程、导出线程信息、执行GC等。

例1:列出所有的java进程
$ jcmd -l
5601 ruoyi-admin.jar
1852 sun.tools.jcmd.JCmd -l
例2:查看虚拟机运行时长 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:查看系统中类的统计信息
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:导出堆信息
$ jcmd 5601 GC.heap_dump ~/dump.log
5601:
Heap dump file created

GC.heap_dump 接收一个参数作为堆Dump文件的输出路径,得到堆文件后,可以使用MAT或VisualVm等工具进行分析。

例6:获取系统的properties内容
$ 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:获得启动参数
$ 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:获得所有性能统计相关数据
$ 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"
... 省略其他输出

在这个输出中,可以找到所有的性能统计相关的数据,如活动的线程数、活动线程峰值等信息。


免责声明:本站发布的内容(图片、视频和文字)以原创、来自互联网转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系QQ:712375056 进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。