Java中的jdk命令行工具有哪些
这期内容当中小编将会给大家带来有关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
可以由以下值构成: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
结合 interval
和 count
参数,可以持续观察堆使用情况及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可以为以下参数:
-flag
:打印指定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.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 输出内容较多,建议将内容输出到文件中。
例2:导出java程序的当前堆快照
$ jmap -dump:format=b,file=/home/www/heap.dump 5601 Dumping heap to /home/www/heap.dump ... Heap dump file created
导出堆文件后,可以使用Visual VM
或 MAT
等工具分析。
例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? type3538 6193214 null live 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]
-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" ... 省略其他输出
在这个输出中,可以找到所有的性能统计相关的数据,如活动的线程数、活动线程峰值等信息。
上述就是小编为大家分享的Java中的jdk命令行工具有哪些了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。
名称栏目:Java中的jdk命令行工具有哪些
浏览地址:http://cdiso.cn/article/ipeiii.html