標籤:jstack jcmd
1.jcmd
1.1作用
發送診斷命令請求到正在啟動並執行Java虛擬機器(JVM)。
它必須和JVM運行在同一台機器上,並且與啟動JVM使用者具有相同的組許可權。
1.2文法
jcmd [-l|-h|-help]jcmd pid|main-class PerfCounter.printjcmd pid|main-class -f filenamejcmd pid|main-class command[ arguments]
Perfcounter.print:列印Java進程的效能計數器
-f filename:從中讀取診斷命令,每行命令必須在一行內寫完
command [arguments]:診斷指令
1.3命令列表
C:\Users\Administrator>jcmd 7048 help7048:The following commands are available:VM.native_memoryVM.commercial_featuresManagementAgent.stopManagementAgent.start_localManagementAgent.startThread.printGC.class_histogramGC.heap_dumpGC.run_finalizationGC.runVM.uptimeVM.flagsVM.system_propertiesVM.command_lineVM.version
#列印JDK及版本C:\Users\Administrator>jcmd 7048 VM.version7048:Java HotSpot(TM) 64-Bit Server VM version 24.75-b04JDK 7.0_75#列印虛擬機器系統屬性可以有幾百行的資訊顯示。C:\Users\Administrator>jcmd 7048 VM.system_properties7048:#Sat Apr 15 21:24:31 CST 2017java.runtime.name=Java(TM) SE Runtime Environmentsun.boot.library.path=D\:\\Java\\jdk1.7.0_75\\jre\\binjava.vm.version=24.75-b04shared.loader=java.vm.vendor=Oracle Corporationjava.vendor.url=http\://java.oracle.com/path.separator=;java.vm.name=Java HotSpot(TM) 64-Bit Server VMtomcat.util.buf.StringCache.byte.enabled=truefile.encoding.pkg=sun.io...#列印用於虛擬機器的所有標誌即使沒有設定,一些預設值將被列印出來C:\Users\Administrator>jcmd 7048 VM.flags7048:-XX:InitialHeapSize=132669696 -XX:MaxHeapSize=2124414976 -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC7048:[Global flags] uintx AdaptivePermSizeWeight = 20 {product} uintx AdaptiveSizeDecrementScaleFactor = 4 {product} uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product} uintx AdaptiveSizePausePolicy = 0 {product} uintx AdaptiveSizePolicyCollectionCostMargin = 50 {product} uintx AdaptiveSizePolicyInitializingSteps = 20 {product} uintx AdaptiveSizePolicyOutputInterval = 0 {product} uintx AdaptiveSizePolicyWeight = 10 {product} uintx AdaptiveSizeThroughPutPolicy = 0 {product} uintx AdaptiveTimeWeight = 25 {product} bool AdjustConcurrency = false {product} bool AggressiveOpts = false {product} intx AliasLevel = 3 {C2 product} bool AlignVector = true {C2 product} uintx InitialHeapSize := 132669696 {product} ... #冒號:表示非預設值 #列印(秒)正常已耗用時間 C:\Users\Administrator>jcmd 7048 VM.uptime 7048: 2213.664 s #類長條圖 C:\Users\Administrator>jcmd 7048 GC.class_histogram > 12333.txt 7048: num #instances #bytes class name---------------------------------------------- 1: 11678 8137440 [B 2: 30213 4300992 [C 3: 28188 3966976 <constMethodKlass> 4: 28188 3619568 <methodKlass> 5: 2339 2866712 <constantPoolKlass> 6: 2038 1698944 <constantPoolCacheKlass> 7: 2339 1659448 <instanceKlassKlass> 8: 28718 689232 java.lang.String 9: 16608 531456 java.util.HashMap$Entry 10: 736 416896 <methodDataKlass> 11: 6144 369080 [Ljava.lang.Object; 12: 2620 254960 java.lang.Class 13: 877 234768 [Ljava.util.HashMap$Entry; 14: 3569 229624 [S 15: 3773 214248 [[I....#建立堆轉儲(HPROF) C:\Users\Administrator>jcmd 7048 GC.heap_dump filename=Myheapdump7048:Heap dump file created 與jmap -dump:file=<file> <pid>功能一樣#建立一個堆長條圖 jcmd <process id/main class> GC.class_histogram filename=Myheaphistogram使用jmap -histo <pid> 列印線程的棧資訊C:\Users\Administrator>jcmd 7048 Thread.print7048:2017-04-15 21:43:28Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.75-b04 mixed mode):"ajp-bio-8009-AsyncTimeout" daemon prio=6 tid=0x000000000d5bb000 nid=0x78c waiting on condition [0x000000000f16f000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at org.apache.tomcat.util.net.JIoEndpoint$AsyncTimeout.run(JIoEndpoint.java:152) at java.lang.Thread.run(Thread.java:745) .......
| {product} |
| {C2 product} |
| {pd product} |
| {C1 product} |
| {manageable}:運行時動態更改 |
| {C2 pd product} |
| {ARCH product} |
| {C1 pd product} |
| {lp64_product} |
| {product rw} |
(2)jstack
2.1 作用
列印Java進程,核心檔案或者遠端偵錯伺服器的Java線程堆疊追蹤.
-
死結監測和HANG
-
使用jsadebugd 守護進程查詢遠程機器上的core檔案及進程
-
-l,可以列印java.util.concurrent.locks同步資訊和堆上的同步器,沒有該選項,僅僅是監視器的資訊。
-
jstack pid 與 ctrl+break
-
也可以Thread.getAllStackTraces
2.2 文法
jstack [ options ] pidjstack [ options ] executable corejstack [ options ] [ [email protected] ] remote-hostname-or-IP
每一個棧幀,列印資訊包括類名,方法名,位元組碼索引(BCI),和行數。-m開關,同時列印本地和java棧幀資訊。
當指定的進程在一個64位Java虛擬機器上運行,則可能需要指定-J-d64選項,例如:jstack -J-d64 -m pid。
2.3 參數Options
-F:強制dump
-l:列印額外資訊
-m:列印混合堆棧資訊(c++,java)
http://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html
http://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr016.html
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jcmd.html
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html
本文出自 “簡單” 部落格,請務必保留此出處http://dba10g.blog.51cto.com/764602/1916346
java內建命令列工具(jcmd,jstack)