您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Java中的jdk命令行工具有哪些,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
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
jps
命令不加任何參數,可以列出java進程id及main函數名稱:$ jps 5601 jar 30536 Jps
-q
可以指定jps只輸出進程id:$ jps -q 5601 30604
-m
可以用于輸出傳遞給java進程(主函數)的參數jps -m 5601 jar 30682 Jps -m
-l
可以用于輸出主函數的完整路徑$ jps -l 5601 ruoyi-admin.jar 30868 sun.tools.jps.Jps
-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
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
參數用于指定一共輸出多少次數據。
$ 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
表示在加載和卸載類上所花的時間。
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
:最后一次編譯失敗的類名和方法名
$ 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:垃圾回收消耗總時間
$ 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
不僅輸出了各個代的當前大小,也包含了各個代的最大值和最小值
$ 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.
$ 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
區大小
$ 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:老年代回收次數
$ 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區當前使用比例
S1:s1區當前使用比例
E:eden區使用比例
O:老年代使用比例
M:元數據區使用比例
CCS:壓縮使用比例
YGC:年輕代垃圾回收次數
FGC:老年代垃圾回收次數
FGCT:老年代垃圾回收消耗時間
GCT:垃圾回收消耗總時間
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
同樣地,上述其他示例也有類似的用法。
jinfo
命令jinfo
命令可以用來查看正在運行的java應用程序的擴展參數,基本語法如下:
jinfo <option> <pid>
其中option可以為以下參數:
-flag<name>
:打印指定java虛擬機的參數值
在很多情況下,java應用程序不會指定所有的java虛擬機參數。而此時,開發人員可能不知道某一個具體的java虛擬機參數的認。在這種情況下,可以使用 jinfo
命令,開發人員可以很方便地找到java虛擬機參數的當前值。
$ jinfo -flag MaxTenuringThreshold 5601 -XX:MaxTenuringThreshold=6
jmap
命令jmap
命令是一個多功能的命令,它可以生成java程序的堆dump文件,也可以查看堆內對象實例的統計信息、查看classLoader的信息以及finalizer隊列。
$ 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 輸出內容較多,建議將內容輸出到文件中。
$ jmap -dump:format=b,file=/home/www/heap.dump 5601 Dumping heap to /home/www/heap.dump ... Heap dump file created
導出堆文件后,可以使用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
命令jstack命令用于導出java應用程序的線程堆棧,語法為:
jstack [-l] <pid>
-l
用于打印鎖的附加信息。
jstack命令會在控制臺輸出程序中的所有的鎖信息,可以使用重定向將輸出內容保存到文件中,如:
jstack -l 5601 > ./thread.log
jcmd
命令在jdk1.7后,新增了一個命令行工具 jcmd
。它是一個多功能的工具,可以用來導出堆、查看java進程、導出線程信息、執行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
接收一個參數作為堆Dump文件的輸出路徑,得到堆文件后,可以使用MAT或VisualVm等工具進行分析。
$ 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" ... 省略其他輸出
在這個輸出中,可以找到所有的性能統計相關的數據,如活動的線程數、活動線程峰值等信息。
上述就是小編為大家分享的Java中的jdk命令行工具有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。