深入理解java虛擬機器的故障處理工具

NO IMAGE

前言

本文主要給大家介紹的是java虛擬機器的故障處理工具,文中提到這些工具包括:

名稱主要作用
jpsJVM process Status Tool, 顯示指定系統內所有的HotSpot虛擬機器程序。通常是本地主機
jstatJVM Statistics Monitoring Tool,用於收集HotSpot虛擬機器各方面的執行資料
jinfoConfiguration Info for java, 顯示虛擬機器配置資訊
jmapMemory Map for Java, 生成虛擬機器的記憶體儲存快照(heapdump檔案)
jhatJVM Heap Dump Browser, 用於分析heapdump檔案,它建立一個HTTP/HTML伺服器,讓使用者可以在瀏覽器上檢視分析結果
jstackStack Trace for Java, 顯示虛擬機器的執行緒快照

jps:虛擬機器程序狀況工具

jps的功能和unix/liunx中的ps命令是類似。只不過它是列印出正在執行的虛擬機器程序,並顯示虛擬機器執行主類的名稱以及這些程序的本地虛擬機器唯一ID(Local Virtual Machine Identifier, LVMID,通常是系統程序ID)。

jps命令格式:


jps [options] [hostId]

jps可以通過RMI協議查詢開啟了RMI服務的遠端虛擬機器程序狀態,hostId為RMI登錄檔中註冊的主機名稱。

jps其他常用選項:

     -q 只輸出LVMID, 省略主類的名稱;

     -m 輸出虛擬機器程序啟動時候傳遞給主類main()函式的引數;

     -l 輸出主類的全稱,如果程序執行的是jar包,輸出jar路徑;

     -v 輸出虛擬機器程序啟動時候JVM引數。

jps命令樣例:


[[email protected] ~]# jps -l
3914 org.zhangyoubao.payservice.App
12180 sun.tools.jps.Jps
6913 org.zhangyoubao.userprofiler.App

jstat:虛擬機器統計資訊監視工具

jstat是用於監視虛擬機器各種執行狀態資訊的工具。它可以顯示本地或遠端虛擬機器程序中類load,記憶體gc.jit等執行引數。

jstat命令格式:


jstat [option vmid [interval [s|ms] [count]]]

interval和count代表查詢間隔和次數。如果省略這兩個引數,說明只查詢一次。

jstat其他常用選項:

     -class            監視類load/unload數量、總空間已經裝載時間;

     -compiler         輸出JIT編譯器編譯過的方法、耗時等資訊;

     -printcompilation 輸出已經被JIT編譯的方法;

     -gc               監視java堆狀況;

     -gccapacity       監視內容與-gc基本相同,但輸出關注java各個區域的最大/最小空間;

     -gcutil           監視內容與-gc基本相同,但輸出關注已使用空間佔用百分百比;

     -gccause          與-gcutil功能一樣,額外輸出導致上一次GC產生原因;

     -gcnew            監視新生代GC狀況;

     -gcnewcapacity    監視新生代,輸出同-gccapacity;

     -gcold            監視老年代GC狀況;

     -gcoldcapacity    監視老年代,輸出同-gccapacity;

     -gcpermcapactiy   監視永久代(程式碼區),輸出同-gccapacity;

jstat命令樣例:


[[email protected] ~]# jstat -gc 6913
S0C S1C S0U S1U  EC  EU  OC   OU  PC  PU YGC  YGCT FGC FGCT  GCT 
34048.0 34048.0 0.0 3217.8 272640.0 171092.7 683264.0 168910.7 46872.0 28031.2 37857 380.644 69  3.447 384.091

jinfo:Java配置資訊工具

jinfo的作用是實時的檢視和調整虛擬機器各項引數。

jinfo命令格式:


jinfo [option] pid

jinfo其他常用選項:

     -flag name=value 修改引數

     -flag name 引數引數

jinfo命令樣例:


[[email protected] ~]# jinfo 6913
Attaching to process ID 6913, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.91-b01
Java System Properties:
...
VM Flags:
-Xms1000m -Xmx1000m -Dconf=/usr/local/user_profiler/conf -Dserver.root=/usr/local/user_profiler -Dcom.sun.management.jmxremote.port=7003 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -verbose:gc -XX: PrintGCDetails -XX: PrintGCDateStamps -XX: UseConcMarkSweepGC

jmap:java記憶體對映工具

jmap命令可以用於生產堆儲存快照(dump檔案)。它還可以查下finalize佇列(自我拯救佇列)、java堆和程式碼區的詳細資訊。

jmap命令格式:


jmap [option] vmid

jmap其他常用選項:

     -dump          生成java堆儲存快照。格式:-dump:[live,]format=b,file=<filename>;

     -finalizerinfo 顯示F-Queue中等待Finalizer現象執行finalize方法的物件;

     -heap          顯示java堆詳細資訊,如使用哪種回收器、引數配置、分代狀況等待;

     -histo         顯示堆中物件統計資訊,包括類、例項書、合計容量;

     -permstat      以ClassLoader為統計入口顯示永久代記憶體資訊;

     -F             當虛擬機器程序堆-dump選項沒有響應時候,可以使用這個選項強制生成dump快照。

jmap命令樣例:


[[email protected] ~]# jmap -histo 6913|head -20
num  #instances   #bytes class name
----------------------------------------------
1:  1864966  113459432 [C
2:  201846  49201192 [B
3:  1597065  38329560 java.lang.String
4:  117477  15037056 org.zhangyoubao.thriftdef.UserUsefulInfo
5:   47104  11072048 [I
6:  268631  8596192 java.util.HashMap$Entry
7:   48812  7451760 <constMethodKlass>
8:  100683  6443712 com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty
9:   48812  6257856 <methodKlass>
10:   4230  5271640 <constantPoolKlass>
11:  159491  5103712 java.util.Hashtable$Entry
12:  120226  4809040 org.zhangyoubao.common.cache.adv.Node
13:  127027  4064864 java.util.concurrent.ConcurrentHashMap$HashEntry
14:  230433  3686928 java.lang.Integer
15:   3765  3049824 <constantPoolCacheKlass>
16:   20917  3012048 com.mysql.jdbc.Field
17:   4230  2943840 <instanceKlassKlass>

其中[C=char[],[B=byte[],[S=short[],[I=int[],[[I=int[][]

jhat: 虛擬機器堆轉存快照分析工具

jhat 命令用於與jmap搭配使用,用來分析jmap生成的dump檔案。jhat內建了一個微型的HTTP/HTML伺服器,生成的dump檔案的分析結果後,可以在瀏覽器檢視。

jhat命令格式:


jmap filename

jhat命令樣例:


[[email protected] ~]# jhat html_intercept_server.dump 
Reading from html_intercept_server.dump...
Dump file created Wed Nov 23 13:05:33 CST 2016
Snapshot read, resolving...
Resolving 203681 objects...
Chasing references, expect 40 dots........................................
Eliminating duplicate references........................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

jstack:java執行緒堆疊跟蹤工具

jstack用於生成虛擬機器當前時刻的執行緒快照。執行緒快照就是當前虛擬機器每一條執行緒正在執行的方法堆疊計劃,生成執行緒快照的主要目的是定位執行緒長時間停頓的原因。線上程停頓的時候,通過jstack來檢視沒有響應的執行緒在後臺做些什麼事情,或者等待著什麼資源。

jstack命令格式:


jstack [option] vmid

jstack其他選項:

     -F 當正常輸出的請求不被響應的時候,強制輸出執行緒堆疊;

     -l 除了顯示堆疊外,顯示關於鎖的附加資訊;

     -m 如果呼叫本地方法,可以顯示C/C 的堆疊。

jstack命令樣例:


[[email protected] ~]# jstack 29577|head -20
2016-11-23 12:58:23
Full thread dump OpenJDK Server VM (24.91-b01 mixed mode):
"pool-1-thread-7261" prio=10 tid=0x0893a400 nid=0x6b0d waiting on condition [0x652ad000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x75b5b400> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:359)
at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:942)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
"service_hot_lscs-0" daemon prio=10 tid=0x6982dc00 nid=0x6aeb waiting on condition [0x64ce1000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at org.zhangyoubao.video.client.runner.SimpleVideoRunner.doWork(SimpleVideoRunner.java:150)

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

您可能感興趣的文章:

java 虛擬機器深入瞭解淺談Java的虛擬機器結構以及虛擬機器記憶體的優化瞭解Java虛擬機器JVM的基本結構及JVM的記憶體溢位方式解析Java虛擬機器中類的初始化及載入器的父委託機制Java虛擬機器JVM效能優化(三):垃圾收集詳解Java虛擬機器JVM效能優化(二):編譯器Java虛擬機器JVM效能優化(一):JVM知識總結Java虛擬機器最多支援多少個執行緒的探討深入解析java虛擬機器java虛擬機器Java虛擬機器工作原理