您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Java中的jdk命令行工具有哪些,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
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
jps
命令不加任何參數(shù),可以列出java進(jìn)程id及main函數(shù)名稱:$ jps 5601 jar 30536 Jps
-q
可以指定jps只輸出進(jìn)程id:$ jps -q 5601 30604
-m
可以用于輸出傳遞給java進(jìn)程(主函數(shù))的參數(shù)jps -m 5601 jar 30682 Jps -m
-l
可以用于輸出主函數(shù)的完整路徑$ jps -l 5601 ruoyi-admin.jar 30868 sun.tools.jps.Jps
-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
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ù)。
$ 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í)間。
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
:最后一次編譯失敗的類名和方法名
$ 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í)間
$ 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è)代的最大值和最小值
$ 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.
$ 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ū)大小
$ 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ù)
$ 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
$ 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
$ 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í)間
jstat
結(jié)合 interval
和 count
參數(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
同樣地,上述其他示例也有類似的用法。
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)前值。
$ jinfo -flag MaxTenuringThreshold 5601 -XX:MaxTenuringThreshold=6
jmap
命令jmap
命令是一個(gè)多功能的命令,它可以生成java程序的堆dump文件,也可以查看堆內(nèi)對(duì)象實(shí)例的統(tǒng)計(jì)信息、查看classLoader的信息以及finalizer隊(duì)列。
$ 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)容輸出到文件中。
$ jmap -dump:format=b,file=/home/www/heap.dump 5601 Dumping heap to /home/www/heap.dump ... Heap dump file created
導(dǎo)出堆文件后,可以使用Visual VM
或 MAT
等工具分析。
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
$ 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
jstack命令用于導(dǎo)出java應(yīng)用程序的線程堆棧,語法為:
jstack [-l] <pid>
-l
用于打印鎖的附加信息。
jstack命令會(huì)在控制臺(tái)輸出程序中的所有的鎖信息,可以使用重定向?qū)⑤敵鰞?nèi)容保存到文件中,如:
jstack -l 5601 > ./thread.log
jcmd
命令在jdk1.7后,新增了一個(gè)命令行工具 jcmd
。它是一個(gè)多功能的工具,可以用來導(dǎo)出堆、查看java進(jìn)程、導(dǎo)出線程信息、執(zhí)行GC等。
$ jcmd -l 5601 ruoyi-admin.jar 1852 sun.tools.jcmd.JCmd -l
VM.uptime
jcmd 5601 VM.uptime 5601: 3301407.004 s
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 ... 省略其他輸出
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 ... 省略其他輸出
$ jcmd 5601 GC.heap_dump ~/dump.log 5601: Heap dump file created
GC.heap_dump
接收一個(gè)參數(shù)作為堆Dump文件的輸出路徑,得到堆文件后,可以使用MAT或VisualVm等工具進(jìn)行分析。
$ 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/ ... 省略其他輸出
$ 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
$ 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è)資訊頻道。
免責(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)容。