JVM 監控工具html
官方手冊:https://docs.oracle.com/javase/8/docs/technotes/tools/index.htmljava
功能: 列出正在運行的虛擬機並顯示虛擬機執行主類名稱web
主要參數:apache
-q: 只顯示進程ID
-m: 顯示傳遞給main方法的參數
-l: 顯示應用程序mian方法名稱或jar文件的路徑名
-v: 顯示傳遞給JVM虛擬機的參數ubuntu
實例:瀏覽器
$ jps 16420 Bootstrap 32375 Jps
$ jps -v 16420 Bootstrap -Djava.util.logging.config.file=/home/jenkins/tomcat/jenkins/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -verbose:gc -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -Xms4g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.69 -Dignore.endorsed.dirs= -Dcatalina.base=/home/jenkins/tomcat/jenkins -Dcatalina.home=/home/jenkins/tomcat/jenkins -Djava.io.tmpdir=/home/jenkins/tomcat/jenkins/temp 32333 Jps -Denv.class.path=.:/home/ubuntu/software/jdk/jdk1.8.0_151/lib:/home/ubuntu/software/jdk/jdk1.8.0_151/jre/lib -Dapplication.home=/home/ubuntu/software/jdk/jdk1.8.0_151 -Xms8m
功能: 監視虛擬機各類運行狀態信息,能夠顯示本地或遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據tomcat
命令格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
bash
選項 | 做用 |
---|---|
-class | 監視類裝載、卸載數量、總空間以及類裝載所消耗的時間 |
-compiler | 輸出JIT編譯器編譯過的方法和、耗時 |
-gc | 監視Java堆情況 |
-gccapacity | 監視內容與-gc基本相同,主要關注java堆各個區域使用到的最大、最小空間 |
-gccause | 與-gcutil功能相同,灰額外輸出致使上一次GC產生的緣由 |
-gcmetacapacity | 監視元空間 |
-gcnew | 監視新生代GC狀況 |
-gcnewcapacity | 監視內容與-gcnew相同,輸出主要關注使用到的最大、最小空間 |
-gcold | 監視老年代GC狀況 |
-gcoldcapacity | 監視內容與-gcold相同,輸出主要關注使用到的最大、最小空間 |
-gcutil | 監視內容與-gc基本相同,主要關注已使用空間佔總空間的百分比 |
-printcompilation | 輸出已經被JIT編譯的方法 |
$ jstat -class 16420 # 加載的類數 大小(Kb) 卸載的類數 大小(Kb) 執行類加載和卸載操做花費的時間 Loaded Bytes Unloaded Bytes Time 15096 30199.4 3 4.6 15.34
$ jstat -gc 16420 # 單位是KB # survivor0容量 survivor1容量 survivor0使用 survivor1使用 Eden容量 Eden使用 OLD容量 OLD使用 元空間容量 元空間使用 壓縮類空間容量 壓縮類空間使用 年輕代GC數量 年輕代GC時間 Full GC數量 Full GC時間 GC總時間 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 29696.0 28160.0 560.5 0.0 1339904.0 124539.0 2796544.0 144642.9 99072.0 89527.5 12544.0 10189.7 42 0.550 5 0.566 1.116
$ jstat -gccapacity 16420 # 最小新生代容量 最大新生代容量 當前新生代容量 survivor0容量 survivor1容量 Eden容量 最小老年代容量 最大老年代容量 當前老年代容量 老年代空間容量 最小元空間容量 最大元空間容量 元空間大小 最小壓縮類空間容量 最大壓縮類空間容量 壓縮類空間容量 年輕代GC數量 FUll GC數量 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC 1397760.0 1397760.0 1397760.0 29696.0 28160.0 1339904.0 2796544.0 2796544.0 2796544.0 2796544.0 0.0 1136640.0 99072.0 0.0 1048576.0 12544.0 42 5
關於OGC和GC的區別:https://stackoverflow.com/questions/11253285/jstat-difference-between-ogc-oc-pgc-pc
OGC = sum(all OC),可是HotShot中old space只有一個服務器
$ jstat -gcutil 16420 # Survivor0使用比 Survivor0使用比 Eden使用比 OLD使用比 元空間使用比 壓縮類使用比 年輕代GC數量 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 1.89 0.00 16.46 5.17 90.37 81.23 42 0.550 5 0.566 1.116
# jstat -gccause 16420 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC 1.89 0.00 17.20 5.17 90.37 81.23 42 0.550 5 0.566 1.116 Allocation Failure No GC
隔2秒監控一次堆使用狀況,監測5次websocket
$ jstat -gcutil 16420 2000 5 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116 1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116 1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116 1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116 1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116
功能:實施查看和調整虛擬機參數
命令格式
jinfo [option] <pid> 參數: -flag <name> 打印虛擬機參數的值 -flag [+|-]<name> 啓用或關閉虛擬機參數 -flag <name>=<value> 設置虛擬機參數 -flags 打印虛擬機參數
$ jinfo -flag InitialHeapSize 16420 -XX:InitialHeapSize=4294967296
jinfo -flags 16420 Attaching to process ID 16420, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.151-b12 Non-default VM flags: -XX:CICompilerCount=4 -XX:+HeapDumpOnOutOfMemoryError -XX:InitialHeapSize=4294967296 -XX:+ManagementServer -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=1431306240 -XX:OldSize=2863661056 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC Command line: -Djava.util.logging.config.file=/home/jenkins/tomcat/jenkins/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -verbose:gc -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -Xms4g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.69 -Dignore.endorsed.dirs= -Dcatalina.base=/home/jenkins/tomcat/jenkins -Dcatalina.home=/home/jenkins/tomcat/jenkins -Djava.io.tmpdir=/home/jenkins/tomcat/jenkins/temp
功能: 生成堆轉儲快照,查詢finalize執行隊列、Java堆詳細信息、當前使用的那種收集器
主要選擇
選擇 | 做用
---|---
-heap | 顯示java堆信息,如使用哪一種回收器、參數配置、分代狀況
-histo | 顯示堆中對象統計信息,包括類、實例數量、合計容量
-dump | 生成java堆轉儲快照
-clstats | 打印Java堆的類加載器的統計信息。對於每一個類加載器,它的名稱,它的活動程度,地址,父類加載器以及它加載的類的數量和大小都會被打印出來。
-finalizerinfo | 打印有關正在等待最終肯定的對象的信息
-F | 當虛擬機進程沒有響應時強制生成dump快照
# 須以root用戶執行 $ jmap -J-d64 -heap 16420 Attaching to process ID 16420, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.151-b12 using thread-local object allocation. Parallel GC with 8 thread(s) # 垃圾收集器 Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 4294967296 (4096.0MB) NewSize = 1431306240 (1365.0MB) MaxNewSize = 1431306240 (1365.0MB) OldSize = 2863661056 (2731.0MB) NewRatio = 2 # 老年代佔據堆的2/3,新生代佔據1/3 SurvivorRatio = 8 # Survivor:Eden=1:8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: # Eden區內存分佈 capacity = 1378353152 (1314.5MB) used = 74006280 (70.57788848876953MB) free = 1304346872 (1243.9221115112305MB) 5.36918132284287% used From Space: # 其中一個Survivor區的內存分佈 capacity = 27262976 (26.0MB) used = 0 (0.0MB) free = 27262976 (26.0MB) 0.0% used To Space: # 另外一個Survivor區的內存分佈 capacity = 25690112 (24.5MB) used = 0 (0.0MB) free = 25690112 (24.5MB) 0.0% used PS Old Generation capacity = 2863661056 (2731.0MB) used = 60243072 (57.4522705078125MB) free = 2803417984 (2673.5477294921875MB) 2.1037081841015195% used 38423 interned Strings occupying 4154104 bytes.
# 須以jvm啓動用戶執行該命令 $ jmap -histo:live 16420 num #instances #bytes class name ---------------------------------------------- 1: 187022 22144672 [C 2: 185124 4442976 java.lang.String 3: 85170 2725440 java.util.HashMap$Node 4: 29978 2638064 java.lang.reflect.Method 5: 40422 2440632 [Ljava.lang.Object; 6: 6915 2123840 [B 7: 15533 1718560 java.lang.Class ... ... .... ... 6186: 1 16 sun.util.resources.LocaleData 6187: 1 16 sun.util.resources.LocaleData$LocaleDataResourceBundleControl 6188: 1 16 websocket.drawboard.DrawboardContextListener Total 1186181 62814680
$ jmap -dump:live,format=b,file=jenkins.bin 16420 Dumping heap to /home/jenkins/jenkins.bin ... $ ll jenkins.bin -h -rw------- 1 jenkins jenkins 1011M 2月 14 11:43 jenkins.bin
功能:分析jamp生成的堆轉儲快照,jhat內置了一個微型HTTP服務器,生成dump文件的分析結果後能夠在瀏覽器查看。
通常不會在生產服務器上進行分析,很是耗CPU和內存,不經常使用
jhat jenkins.bin Reading from jenkins.bin... Dump file created Thu Feb 14 11:43:45 CST 2019 Snapshot read, resolving... Resolving 12022774 objects... Chasing references, expect 2404 dots Eliminating duplicate references Snapshot resolved. Started HTTP server on port 7000 Server is ready.
使用瀏覽器訪問http://ip:7000 查看分析結果
功能: 生成虛擬機當前時刻的線程快照(通常稱爲threaddump、javacore文件)
參數:
-l: 打印關於鎖的信息
-m: 打印java和native frames 的信息
$ jstack -l 16420 > jenkins.jstack
線程的幾種狀態: 狀態 | 含義 ---|--- NEW|未啓動的,不會出如今dump中 RUNNABLE|在虛擬機內執行的。運行中狀態,可能裏面還能看到locked字樣,表面它得到了某把鎖 BLOCKED|受阻塞並等待監視器鎖。被某個鎖(synchronizers)給block住了。 WATING|無限期等待另外一個線程執行特定操做。等待某個condition或monitor發生,通常停留在park(), wait(), sleep(),join() 等語句裏。 TIMED_WATING|有時限的等待另外一個線程的特定操做。和WAITING的區別是wait() 等語句加上了時間限制 wait(timeout)。 TERMINATED|已退出的。