java虛擬機故障處理工具

概述

給系統定位問題的時候,知識、經驗是關鍵基礎,數據是依據,工具是運用知識處理數據的手段。html

java開發人員能夠在jdk安裝的bin目錄下找到除了java,javac之外的其餘命令。這些命令主要是一些用於監視虛擬機和故障處理的工具。這些工具包括:java

名稱 主要做用
jps JVM process Status Tool, 顯示指定系統內全部的HotSpot虛擬機進程。一般是本地主機
jstat JVM Statistics Monitoring Tool,用於收集HotSpot虛擬機各方面的運行數據
jinfo Configuration Info for java, 顯示虛擬機配置信息
jmap Memory Map for Java, 生成虛擬機的內存存儲快照(heapdump文件)
jhat JVM Heap Dump Browser, 用於分析heapdump文件,它創建一個HTTP/HTML服務器,讓用戶能夠在瀏覽器上查看分析結果
jstack Stack Trace for Java, 顯示虛擬機的線程快照

jps:虛擬機進程情況工具

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

jps命令格式sql

jps [options] [hostId]

jps能夠經過RMI協議查詢開啓了RMI服務的遠程虛擬機進程狀態,hostId爲RMI註冊表中註冊的主機名稱。瀏覽器

jps其餘經常使用選項bash

-q 只輸出LVMID, 省略主類的名稱;
-m 輸出虛擬機進程啓動時候傳遞給主類main()函數的參數;
-l 輸出主類的全稱,若是進程執行的是jar包,輸出jar路徑;
-v 輸出虛擬機進程啓動時候JVM參數。

jps命令樣例服務器

[root@localhost ~]# jps -l
3914 org.zhangyoubao.payservice.App
12180 sun.tools.jps.Jps
6913 org.zhangyoubao.userprofiler.App

jstat:虛擬機統計信息監視工具

jstat是用於監視虛擬機各類運行狀態信息的工具。它能夠顯示本地或遠程虛擬機進程中類load,內存gc.jit等運行參數。ide

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命令樣例

[root@localhost ~]# 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命令樣例

[root@localhost ~]# 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命令樣例

[root@localhost ~]# 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命令樣例

[root@localhost ~]# 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命令樣例

[root@localhost ~]# 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)
相關文章
相關標籤/搜索